diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..3945bae --- /dev/null +++ b/404.html @@ -0,0 +1,1619 @@ + + + + + + + + + + + + + + + + + + + Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..b272543 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +docs.thestratos.org diff --git a/assets/android-chrome-192x192.png b/assets/android-chrome-192x192.png new file mode 100644 index 0000000..dd87995 Binary files /dev/null and b/assets/android-chrome-192x192.png differ diff --git a/assets/android-chrome-512x512.png b/assets/android-chrome-512x512.png new file mode 100644 index 0000000..ad2c6e0 Binary files /dev/null and b/assets/android-chrome-512x512.png differ diff --git a/assets/apple-touch-icon.png b/assets/apple-touch-icon.png new file mode 100644 index 0000000..a4a3526 Binary files /dev/null and b/assets/apple-touch-icon.png differ diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..c52e024 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,2657 @@ +/* Fonts */ +:root { + --font-default: "Open Sans", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-primary: "Montserrat", sans-serif; + --font-secondary: "Poppins", sans-serif; +} + +/* Colors */ +:root { + --color-default: #d1d1d1; + --color-primary: #008374; + --color-secondary: #f85a40; +} + +/* Smooth scroll behavior */ +:root { + scroll-behavior: smooth; +} + +/*-------------------------------------------------------------- +# General +--------------------------------------------------------------*/ +body { + font-family: var(--font-default); + color: var(--color-default); +} + +a { + color: var(--color-primary); + text-decoration: none; +} + +a:hover { + color: #00b6a1; + text-decoration: none; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--font-primary); +} + +/*-------------------------------------------------------------- +# Sections & Section Header +--------------------------------------------------------------*/ +section { + padding: 60px 0; + overflow: hidden; +} + +.sections-bg { + background-color: #016257; +} + +.section-header { + text-align: center; + padding-bottom: 60px; +} + +.section-header h2 { + font-size: 32px; + font-weight: 600; + margin-bottom: 20px; + padding-bottom: 20px; + position: relative; +} + +.section-header h2:after { + content: ""; + position: absolute; + display: block; + width: 50px; + height: 3px; + background: #008374; + left: 0; + right: 0; + bottom: 0; + margin: auto; +} + +.section-header p { + margin-bottom: 0; + color: #008374; +} + +/*-------------------------------------------------------------- +# Breadcrumbs +--------------------------------------------------------------*/ +.breadcrumbs .page-header { + padding: 60px 0 60px 0; + min-height: 20vh; + position: relative; + background-color: var(--color-primary); +} + +.breadcrumbs .page-header h2 { + font-size: 56px; + font-weight: 500; + color: #fff; + font-family: var(--font-secondary); +} + +.breadcrumbs .page-header p { + color: rgba(255, 255, 255, 0.8); +} + +.breadcrumbs nav { + background-color: #f6f6f6; + padding: 20px 0; +} + +.breadcrumbs nav ol { + display: flex; + flex-wrap: wrap; + list-style: none; + margin: 0; + padding: 0; + font-size: 16px; + font-weight: 600; + color: var(--color-default); +} + +.breadcrumbs nav ol a { + color: var(--color-primary); + transition: 0.3s; +} + +.breadcrumbs nav ol a:hover { + text-decoration: underline; +} + +.breadcrumbs nav ol li+li { + padding-left: 10px; +} + +.breadcrumbs nav ol li+li::before { + display: inline-block; + padding-right: 10px; + color: var(--color-secondary); + content: "/"; +} + +/*-------------------------------------------------------------- +# Scroll top button +--------------------------------------------------------------*/ +.scroll-top { + position: fixed; + visibility: hidden; + opacity: 0; + right: 15px; + bottom: -15px; + z-index: 99999; + background: var(--color-secondary); + width: 44px; + height: 44px; + border-radius: 50px; + transition: all 0.4s; +} + +.scroll-top i { + font-size: 24px; + color: #fff; + line-height: 0; +} + +.scroll-top:hover { + background: rgba(248, 90, 64, 0.8); + color: #fff; +} + +.scroll-top.active { + visibility: visible; + opacity: 1; + bottom: 15px; +} + +/*-------------------------------------------------------------- +# Preloader +--------------------------------------------------------------*/ +#preloader { + position: fixed; + inset: 0; + z-index: 999999; + overflow: hidden; + background: #fff; + transition: all 0.6s ease-out; +} + +#preloader:before { + content: ""; + position: fixed; + top: calc(50% - 30px); + left: calc(50% - 30px); + border: 6px solid #fff; + border-color: var(--color-primary) transparent var(--color-primary) transparent; + border-radius: 50%; + width: 60px; + height: 60px; + animation: animate-preloader 1.5s linear infinite; +} + +@keyframes animate-preloader { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +/*-------------------------------------------------------------- +# Disable aos animation delay on mobile devices +--------------------------------------------------------------*/ +@media screen and (max-width: 768px) { + [data-aos-delay] { + transition-delay: 0 !important; + } +} + +/*-------------------------------------------------------------- +# Header +--------------------------------------------------------------*/ +.topbar { + background: #008374; + height: 40px; + font-size: 14px; + transition: all 0.5s; + color: #fff; + padding: 0; +} + +.topbar .contact-info i { + font-style: normal; + color: #fff; + line-height: 0; +} + +.topbar .contact-info i a, +.topbar .contact-info i span { + padding-left: 5px; + color: #fff; +} + +@media (max-width: 575px) { + + .topbar .contact-info i a, + .topbar .contact-info i span { + font-size: 13px; + } +} + +.topbar .contact-info i a { + line-height: 0; + transition: 0.3s; +} + +.topbar .contact-info i a:hover { + color: #fff; + text-decoration: underline; +} + +.topbar .social-links a { + color: rgba(255, 255, 255, 0.7); + line-height: 0; + transition: 0.3s; + margin-left: 20px; +} + +.topbar .social-links a:hover { + color: #fff; +} + +.header { + transition: all 0.5s; + z-index: 997; + height: 90px; + background-color: var(--color-primary); +} + +.header.sticked { + position: fixed; + top: 0; + right: 0; + left: 0; + height: 70px; + box-shadow: 0px 2px 20px rgba(0, 0, 0, 0.1); +} + +.header .logo img { + max-height: 40px; + margin-right: 6px; +} + +.header .logo h1 { + font-size: 30px; + margin: 0; + font-weight: 600; + letter-spacing: 0.8px; + color: #fff; + font-family: var(--font-primary); +} + +.header .logo h1 span { + color: #f96f59; +} + +.sticked-header-offset { + margin-top: 70px; +} + +section { + scroll-margin-top: 70px; +} + +/*-------------------------------------------------------------- +# Desktop Navigation +--------------------------------------------------------------*/ +@media (min-width: 1280px) { + .navbar { + padding: 0; + } + + .navbar ul { + margin: 0; + padding: 0; + display: flex; + list-style: none; + align-items: center; + } + + .navbar li { + position: relative; + } + + .navbar>ul>li { + white-space: nowrap; + padding: 10px 0 10px 28px; + } + + .navbar a, + .navbar a:focus { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 3px; + font-family: var(--font-secondary); + font-size: 16px; + font-weight: 600; + color: rgba(255, 255, 255, 0.6); + white-space: nowrap; + transition: 0.3s; + position: relative; + } + + .navbar a i, + .navbar a:focus i { + font-size: 12px; + line-height: 0; + margin-left: 5px; + } + + .navbar>ul>li>a:before { + content: ""; + position: absolute; + width: 100%; + height: 2px; + bottom: -6px; + left: 0; + background-color: var(--color-secondary); + visibility: hidden; + width: 0px; + transition: all 0.3s ease-in-out 0s; + } + + .navbar a:hover:before, + .navbar li:hover>a:before, + .navbar .active:before { + visibility: visible; + width: 100%; + } + + .navbar a:hover, + .navbar .active, + .navbar .active:focus, + .navbar li:hover>a { + color: #fff; + } + + .navbar .dropdown ul { + display: block; + position: absolute; + left: 28px; + top: calc(100% + 30px); + margin: 0; + padding: 10px 0; + z-index: 99; + opacity: 0; + visibility: hidden; + background: #fff; + box-shadow: 0px 0px 30px rgba(127, 137, 161, 0.25); + transition: 0.3s; + border-radius: 4px; + } + + .navbar .dropdown ul li { + min-width: 200px; + } + + .navbar .dropdown ul a { + padding: 10px 20px; + font-size: 15px; + text-transform: none; + font-weight: 600; + color: #006a5d; + } + + .navbar .dropdown ul a i { + font-size: 12px; + } + + .navbar .dropdown ul a:hover, + .navbar .dropdown ul .active:hover, + .navbar .dropdown ul li:hover>a { + color: var(--color-secondary); + } + + .navbar .dropdown:hover>ul { + opacity: 1; + top: 100%; + visibility: visible; + } + + .navbar .dropdown .dropdown ul { + top: 0; + left: calc(100% - 30px); + visibility: hidden; + } + + .navbar .dropdown .dropdown:hover>ul { + opacity: 1; + top: 0; + left: 100%; + visibility: visible; + } +} + +@media (min-width: 1280px) and (max-width: 1366px) { + .navbar .dropdown .dropdown ul { + left: -90%; + } + + .navbar .dropdown .dropdown:hover>ul { + left: -100%; + } +} + +@media (min-width: 1280px) { + + .mobile-nav-show, + .mobile-nav-hide { + display: none; + } +} + +/*-------------------------------------------------------------- +# Mobile Navigation +--------------------------------------------------------------*/ +@media (max-width: 1279px) { + .navbar { + position: fixed; + top: 0; + right: -100%; + width: 100%; + max-width: 400px; + bottom: 0; + transition: 0.3s; + z-index: 9997; + } + + .navbar ul { + position: absolute; + inset: 0; + padding: 50px 0 10px 0; + margin: 0; + background: rgba(0, 131, 116, 0.9); + overflow-y: auto; + transition: 0.3s; + z-index: 9998; + } + + .navbar a, + .navbar a:focus { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 20px; + font-family: var(--font-primary); + font-size: 15px; + font-weight: 600; + color: rgba(255, 255, 255, 0.7); + white-space: nowrap; + transition: 0.3s; + } + + .navbar a i, + .navbar a:focus i { + font-size: 12px; + line-height: 0; + margin-left: 5px; + } + + .navbar a:hover, + .navbar .active, + .navbar .active:focus, + .navbar li:hover>a { + color: #fff; + } + + .navbar .getstarted, + .navbar .getstarted:focus { + background: var(--color-primary); + padding: 8px 20px; + border-radius: 4px; + margin: 15px; + color: #fff; + } + + .navbar .getstarted:hover, + .navbar .getstarted:focus:hover { + color: #fff; + background: rgba(0, 131, 116, 0.8); + } + + .navbar .dropdown ul, + .navbar .dropdown .dropdown ul { + position: static; + display: none; + padding: 10px 0; + margin: 10px 20px; + transition: all 0.5s ease-in-out; + background-color: #007466; + border: 1px solid #006459; + } + + .navbar .dropdown>.dropdown-active, + .navbar .dropdown .dropdown>.dropdown-active { + display: block; + } + + .mobile-nav-show { + color: rgba(255, 255, 255, 0.6); + font-size: 28px; + cursor: pointer; + line-height: 0; + transition: 0.5s; + z-index: 9999; + margin-right: 10px; + } + + .mobile-nav-hide { + color: #fff; + font-size: 32px; + cursor: pointer; + line-height: 0; + transition: 0.5s; + position: fixed; + right: 20px; + top: 20px; + z-index: 9999; + } + + .mobile-nav-active { + overflow: hidden; + } + + .mobile-nav-active .navbar { + right: 0; + } + + .mobile-nav-active .navbar:before { + content: ""; + position: fixed; + inset: 0; + background: rgba(0, 106, 93, 0.8); + z-index: 9996; + } +} + +/*-------------------------------------------------------------- +# About Us Section +--------------------------------------------------------------*/ +.about h3 { + font-weight: 700; + font-size: 28px; + margin-bottom: 20px; + font-family: var(--font-secondary); +} + +.about .call-us { + left: 10%; + right: 10%; + bottom: 0; + background-color: #fff; + box-shadow: 0px 2px 25px rgba(0, 0, 0, 0.08); + padding: 20px; + text-align: center; +} + +.about .call-us h4 { + font-size: 24px; + font-weight: 700; + margin-bottom: 5px; +} + +.about .call-us p { + font-size: 28px; + font-weight: 700; + color: var(--color-primary); +} + +.about .content ul { + list-style: none; + padding: 0; +} + +.about .content ul li { + padding: 0 0 10px 30px; + position: relative; +} + +.about .content ul i { + position: absolute; + font-size: 20px; + left: 0; + top: -3px; + color: var(--color-primary); +} + +.about .content p:last-child { + margin-bottom: 0; +} + +.about .play-btn { + width: 94px; + height: 94px; + background: radial-gradient(var(--color-primary) 50%, rgba(0, 131, 116, 0.4) 52%); + border-radius: 50%; + display: block; + position: absolute; + left: calc(50% - 47px); + top: calc(50% - 47px); + overflow: hidden; +} + +.about .play-btn:before { + content: ""; + position: absolute; + width: 120px; + height: 120px; + animation-delay: 0s; + animation: pulsate-btn 2s; + animation-direction: forwards; + animation-iteration-count: infinite; + animation-timing-function: steps; + opacity: 1; + border-radius: 50%; + border: 5px solid rgba(0, 131, 116, 0.7); + top: -15%; + left: -15%; + background: rgba(198, 16, 0, 0); +} + +.about .play-btn:after { + content: ""; + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-40%) translateY(-50%); + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-left: 15px solid #fff; + z-index: 100; + transition: all 400ms cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.about .play-btn:hover:before { + content: ""; + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-40%) translateY(-50%); + width: 0; + height: 0; + border: none; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-left: 15px solid #fff; + z-index: 200; + animation: none; + border-radius: 0; +} + +.about .play-btn:hover:after { + border-left: 15px solid var(--color-primary); + transform: scale(20); +} + +@keyframes pulsate-btn { + 0% { + transform: scale(0.6, 0.6); + opacity: 1; + } + + 100% { + transform: scale(1, 1); + opacity: 0; + } +} + +/*-------------------------------------------------------------- +# Clients Section +--------------------------------------------------------------*/ +.clients { + padding: 40px 0; +} + +.clients .swiper { + padding: 10px 0; +} + +.clients .swiper-slide img { + transition: 0.3s; +} + +.clients .swiper-slide img:hover { + transform: scale(1.1); +} + +.clients .swiper-pagination { + margin-top: 20px; + position: relative; +} + +.clients .swiper-pagination .swiper-pagination-bullet { + width: 12px; + height: 12px; + background-color: #fff; + opacity: 1; + background-color: #ddd; +} + +.clients .swiper-pagination .swiper-pagination-bullet-active { + background-color: var(--color-primary); +} + +/*-------------------------------------------------------------- +# Stats Counter Section +--------------------------------------------------------------*/ +.stats-counter { + padding: 40px 0; +} + +.stats-counter .stats-item { + padding: 20px 0; + border-bottom: 1px solid #e4e4e4; +} + +.stats-counter .stats-item .purecounter { + min-width: 90px; + padding-right: 15px; +} + +.stats-counter .stats-item i { + font-size: 44px; + line-height: 0; + margin-right: 15px; +} + +.stats-counter .stats-item span { + font-size: 40px; + display: block; + font-weight: 700; + color: var(--color-primary); + line-height: 40px; +} + +.stats-counter .stats-item p { + margin: 0; + font-family: var(--font-primary); + font-size: 14px; +} + +/*-------------------------------------------------------------- +# Call To Action Section +--------------------------------------------------------------*/ +.call-to-action .container { + background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url("../img/cta-bg.jpg") center center; + background-size: cover; + padding: 100px 60px; + border-radius: 15px; + overflow: hidden; +} + +.call-to-action h3 { + color: #fff; + font-size: 28px; + font-weight: 700; + margin-bottom: 20px; +} + +.call-to-action p { + color: #fff; + margin-bottom: 20px; +} + +.call-to-action .play-btn { + width: 94px; + height: 94px; + margin-bottom: 20px; + background: radial-gradient(var(--color-primary) 50%, rgba(0, 131, 116, 0.4) 52%); + border-radius: 50%; + display: inline-block; + position: relative; + overflow: hidden; +} + +.call-to-action .play-btn:before { + content: ""; + position: absolute; + width: 120px; + height: 120px; + animation-delay: 0s; + animation: pulsate-btn 2s; + animation-direction: forwards; + animation-iteration-count: infinite; + animation-timing-function: steps; + opacity: 1; + border-radius: 50%; + border: 5px solid rgba(0, 131, 116, 0.7); + top: -15%; + left: -15%; + background: rgba(198, 16, 0, 0); +} + +.call-to-action .play-btn:after { + content: ""; + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-40%) translateY(-50%); + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-left: 15px solid #fff; + z-index: 100; + transition: all 400ms cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.call-to-action .play-btn:hover:before { + content: ""; + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-40%) translateY(-50%); + width: 0; + height: 0; + border: none; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-left: 15px solid #fff; + z-index: 200; + animation: none; + border-radius: 0; +} + +.call-to-action .play-btn:hover:after { + border-left: 15px solid var(--color-primary); + transform: scale(20); +} + +.call-to-action .cta-btn { + font-family: var(--font-primary); + font-weight: 500; + font-size: 16px; + letter-spacing: 1px; + display: inline-block; + padding: 12px 48px; + border-radius: 50px; + transition: 0.5s; + margin: 10px; + border: 2px solid #fff; + color: #fff; +} + +.call-to-action .cta-btn:hover { + background: var(--color-primary); + border: 2px solid var(--color-primary); +} + +@keyframes pulsate-btn { + 0% { + transform: scale(0.6, 0.6); + opacity: 1; + } + + 100% { + transform: scale(1, 1); + opacity: 0; + } +} + +/*-------------------------------------------------------------- +# Our Services Section +--------------------------------------------------------------*/ +.services { + padding: 60px 0; +} + +.services .service-item { + padding: 40px; + background: #fff; + height: 100%; + border-radius: 10px; +} + +.services .service-item .icon { + width: 48px; + height: 48px; + position: relative; + margin-bottom: 50px; +} + +.services .service-item .icon i { + color: var(--color-default); + font-size: 56px; + transition: ease-in-out 0.3s; + z-index: 2; + position: relative; +} + +.services .service-item .icon:before { + position: absolute; + content: ""; + height: 100%; + width: 100%; + background: #eeeeee; + border-radius: 50px; + z-index: 1; + top: 10px; + right: -20px; + transition: 0.3s; +} + +.services .service-item h3 { + color: var(--color-default); + font-weight: 700; + margin: 0 0 20px 0; + padding-bottom: 8px; + font-size: 22px; + position: relative; + display: inline-block; + border-bottom: 4px solid #eeeeee; + transition: 0.3s; +} + +.services .service-item p { + line-height: 24px; + font-size: 14px; + margin-bottom: 0; +} + +.services .service-item .readmore { + margin-top: 15px; + display: inline-block; + color: var(--color-primary); +} + +.services .service-item:hover .icon:before { + background: #00b6a1; +} + +.services .service-item:hover h3 { + border-color: var(--color-primary); +} + +/*-------------------------------------------------------------- +# Testimonials Section +--------------------------------------------------------------*/ +.testimonials .testimonial-wrap { + padding-left: 10px; +} + +.testimonials .testimonial-item { + box-sizing: content-box; + padding: 30px; + margin: 30px 10px; + box-shadow: 0px 0 15px rgba(0, 0, 0, 0.1); + position: relative; + background: #fff; + border-radius: 10px; +} + +.testimonials .testimonial-item .testimonial-img { + width: 90px; + border-radius: 50px; + margin-right: 15px; +} + +.testimonials .testimonial-item h3 { + font-size: 18px; + font-weight: bold; + margin: 10px 0 5px 0; + color: #000; +} + +.testimonials .testimonial-item h4 { + font-size: 14px; + color: #999; + margin: 0; +} + +.testimonials .testimonial-item .stars { + margin: 10px 0; +} + +.testimonials .testimonial-item .stars i { + color: #ffc107; + margin: 0 1px; +} + +.testimonials .testimonial-item .quote-icon-left, +.testimonials .testimonial-item .quote-icon-right { + color: #009d8b; + font-size: 26px; + line-height: 0; +} + +.testimonials .testimonial-item .quote-icon-left { + display: inline-block; + left: -5px; + position: relative; +} + +.testimonials .testimonial-item .quote-icon-right { + display: inline-block; + right: -5px; + position: relative; + top: 10px; + transform: scale(-1, -1); +} + +.testimonials .testimonial-item p { + font-style: italic; + margin: 15px auto 15px auto; +} + +.testimonials .swiper-pagination { + margin-top: 20px; + position: relative; +} + +.testimonials .swiper-pagination .swiper-pagination-bullet { + width: 12px; + height: 12px; + background-color: rgba(0, 0, 0, 0.2); + opacity: 1; +} + +.testimonials .swiper-pagination .swiper-pagination-bullet-active { + background-color: var(--color-primary); +} + +@media (max-width: 767px) { + .testimonials .testimonial-wrap { + padding-left: 0; + } + + .testimonials .testimonial-item { + padding: 30px; + margin: 15px; + } + + .testimonials .testimonial-item .testimonial-img { + position: static; + left: auto; + } +} + +/*-------------------------------------------------------------- +# Portfolio Section +--------------------------------------------------------------*/ +.portfolio .portfolio-flters { + padding: 0 0 20px 0; + margin: 0 auto; + list-style: none; + text-align: center; +} + +.portfolio .portfolio-flters li { + cursor: pointer; + display: inline-block; + padding: 0; + font-size: 18px; + font-weight: 500; + margin: 0 10px; + line-height: 1; + transition: all 0.3s ease-in-out; +} + +.portfolio .portfolio-flters li:hover, +.portfolio .portfolio-flters li.filter-active { + color: var(--color-primary); +} + +.portfolio .portfolio-flters li:first-child { + margin-left: 0; +} + +.portfolio .portfolio-flters li:last-child { + margin-right: 0; +} + +@media (max-width: 575px) { + .portfolio .portfolio-flters li { + font-size: 14px; + margin: 0 5px; + } +} + +.portfolio .portfolio-wrap { + box-shadow: 0px 10px 30px rgba(0, 0, 0, 0.1); + border-radius: 10px; + height: 100%; + overflow: hidden; +} + +.portfolio .portfolio-wrap img { + transition: 0.3s; + position: relative; + z-index: 1; +} + +.portfolio .portfolio-wrap .portfolio-info { + padding: 25px 20px; + background-color: #fff; + position: relative; + border-top: 1px solid #f3f3f3; + z-index: 2; +} + +.portfolio .portfolio-wrap .portfolio-info h4 { + font-size: 18px; + font-weight: 600; + padding-right: 50px; +} + +.portfolio .portfolio-wrap .portfolio-info h4 a { + color: var(--color-default); + transition: 0.3s; +} + +.portfolio .portfolio-wrap .portfolio-info h4 a:hover { + color: var(--color-primary); +} + +.portfolio .portfolio-wrap .portfolio-info p { + color: #6c757d; + font-size: 14px; + margin-bottom: 0; + padding-right: 50px; +} + +.portfolio .portfolio-wrap:hover img { + transform: scale(1.1); +} + +/*-------------------------------------------------------------- +# Portfolio Details Section +--------------------------------------------------------------*/ +.portfolio-details .portfolio-details-slider img { + width: 100%; +} + +.portfolio-details .portfolio-details-slider .swiper-pagination .swiper-pagination-bullet { + width: 12px; + height: 12px; + background-color: rgba(255, 255, 255, 0.7); + opacity: 1; +} + +.portfolio-details .portfolio-details-slider .swiper-pagination .swiper-pagination-bullet-active { + background-color: var(--color-primary); +} + +.portfolio-details .swiper-button-prev, +.portfolio-details .swiper-button-next { + width: 48px; + height: 48px; +} + +.portfolio-details .swiper-button-prev:after, +.portfolio-details .swiper-button-next:after { + color: rgba(255, 255, 255, 0.8); + background-color: rgba(0, 0, 0, 0.2); + font-size: 24px; + border-radius: 50%; + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + transition: 0.3s; +} + +.portfolio-details .swiper-button-prev:hover:after, +.portfolio-details .swiper-button-next:hover:after { + background-color: rgba(0, 0, 0, 0.6); +} + +@media (max-width: 575px) { + + .portfolio-details .swiper-button-prev, + .portfolio-details .swiper-button-next { + display: none; + } +} + +.portfolio-details .portfolio-info h3 { + font-size: 22px; + font-weight: 700; + margin-bottom: 20px; + padding-bottom: 20px; + position: relative; +} + +.portfolio-details .portfolio-info h3:after { + content: ""; + position: absolute; + display: block; + width: 50px; + height: 3px; + background: var(--color-primary); + left: 0; + bottom: 0; +} + +.portfolio-details .portfolio-info ul { + list-style: none; + padding: 0; + font-size: 15px; +} + +.portfolio-details .portfolio-info ul li { + display: flex; + flex-direction: column; + padding-bottom: 15px; + font-size: 16px; +} + +.portfolio-details .portfolio-info ul strong { + text-transform: uppercase; + font-weight: 400; + color: #9c9c9c; + font-size: 12px; +} + +.portfolio-details .portfolio-info .btn-visit { + padding: 8px 40px; + background: var(--color-primary); + color: #fff; + border-radius: 50px; + transition: 0.3s; +} + +.portfolio-details .portfolio-info .btn-visit:hover { + background: #009d8b; +} + +.portfolio-details .portfolio-description h2 { + font-size: 26px; + font-weight: 700; + margin-bottom: 20px; +} + +.portfolio-details .portfolio-description p { + padding: 0; +} + +.portfolio-details .portfolio-description .testimonial-item { + padding: 30px 30px 0 30px; + position: relative; + background: white; + height: 100%; + margin-bottom: 50px; +} + +.portfolio-details .portfolio-description .testimonial-item .testimonial-img { + width: 90px; + border-radius: 50px; + border: 6px solid #fff; + float: left; + margin: 0 10px 0 0; +} + +.portfolio-details .portfolio-description .testimonial-item h3 { + font-size: 18px; + font-weight: bold; + margin: 15px 0 5px 0; + padding-top: 20px; +} + +.portfolio-details .portfolio-description .testimonial-item h4 { + font-size: 14px; + color: #6c757d; + margin: 0; +} + +.portfolio-details .portfolio-description .testimonial-item .quote-icon-left, +.portfolio-details .portfolio-description .testimonial-item .quote-icon-right { + color: #009d8b; + font-size: 26px; + line-height: 0; +} + +.portfolio-details .portfolio-description .testimonial-item .quote-icon-left { + display: inline-block; + left: -5px; + position: relative; +} + +.portfolio-details .portfolio-description .testimonial-item .quote-icon-right { + display: inline-block; + right: -5px; + position: relative; + top: 10px; + transform: scale(-1, -1); +} + +.portfolio-details .portfolio-description .testimonial-item p { + font-style: italic; + margin: 0 0 15px 0 0 0; + padding: 0; +} + +/*-------------------------------------------------------------- +# Our Team Section +--------------------------------------------------------------*/ +.team .member { + text-align: center; + background: #fff; + border-radius: 10px; + padding: 15px; + overflow: hidden; + box-shadow: 0px 2px 25px rgba(0, 0, 0, 0.1); +} + +.team .member img { + border-radius: 10px; + overflow: hidden; +} + +.team .member .member-content { + padding: 0 20px 30px 20px; +} + +.team .member h4 { + font-weight: 700; + margin-top: 16px; + margin-bottom: 2px; + font-size: 20px; +} + +.team .member span { + font-style: italic; + display: block; + font-size: 14px; + color: #6c757d; +} + +.team .member p { + padding-top: 10px; + font-size: 14px; + font-style: italic; + color: #6c757d; +} + +.team .member .social { + margin-top: 15px; + margin-bottom: 10px; + display: flex; + align-items: center; + justify-content: space-around; +} + +.team .member .social a { + color: #a2a2a2; + transition: 0.3s; + border-radius: 50%; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #bbbbbb; +} + +.team .member .social a:hover { + color: var(--color-primary); + border-color: var(--color-primary); +} + +.team .member .social i { + font-size: 18px; + margin: 0 2px; +} + +/*-------------------------------------------------------------- +# Pricing Section +--------------------------------------------------------------*/ +.pricing .pricing-item { + padding: 60px 40px; + box-shadow: 0 3px 20px -2px rgba(108, 117, 125, 0.15); + background: #fff; + height: 100%; + position: relative; + border-radius: 15px; +} + +.pricing h3 { + font-weight: 600; + margin-bottom: 15px; + font-size: 20px; + color: #555555; + text-align: center; +} + +.pricing .icon { + margin: 30px auto 30px auto; + width: 70px; + height: 70px; + background: var(--color-primary); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + transition: 0.3s; + transform-style: preserve-3d; +} + +.pricing .icon i { + color: #fff; + font-size: 28px; + transition: ease-in-out 0.3s; + line-height: 0; +} + +.pricing .icon::before { + position: absolute; + content: ""; + height: 86px; + width: 86px; + border-radius: 50%; + background: #87c1bb; + transition: all 0.3s ease-out 0s; + transform: translateZ(-1px); +} + +.pricing .icon::after { + position: absolute; + content: ""; + height: 102px; + width: 102px; + border-radius: 50%; + background: #d2eeeb; + transition: all 0.3s ease-out 0s; + transform: translateZ(-2px); +} + +.pricing h4 { + font-size: 48px; + color: var(--color-secondary); + font-weight: 700; + font-family: var(--font-secondary); + margin-bottom: 0; + text-align: center; +} + +.pricing h4 sup { + font-size: 28px; +} + +.pricing h4 span { + color: rgba(108, 117, 125, 0.8); + font-size: 18px; + font-weight: 400; +} + +.pricing ul { + padding: 20px 0; + list-style: none; + color: #6c757d; + text-align: left; + line-height: 20px; +} + +.pricing ul li { + padding: 10px 0; + display: flex; + align-items: center; +} + +.pricing ul i { + color: #059652; + font-size: 24px; + padding-right: 3px; +} + +.pricing ul .na { + color: rgba(108, 117, 125, 0.5); +} + +.pricing ul .na i { + color: rgba(108, 117, 125, 0.5); +} + +.pricing ul .na span { + text-decoration: line-through; +} + +.pricing .buy-btn { + display: inline-block; + padding: 10px 40px; + border-radius: 50px; + color: var(--color-primary); + border: 1px solid rgba(0, 131, 116, 0.2); + transition: none; + font-size: 16px; + font-weight: 600; + font-family: var(--font-primary); + transition: 0.3s; +} + +.pricing .buy-btn:hover { + background: var(--color-primary); + color: #fff; +} + +.pricing .featured { + z-index: 10; + border: 3px solid var(--color-primary); +} + +@media (min-width: 992px) { + .pricing .featured { + transform: scale(1.15); + } +} + +/*-------------------------------------------------------------- +# Frequently Asked Questions Section +--------------------------------------------------------------*/ +.faq .content h3 { + font-weight: 400; + font-size: 34px; +} + +.faq .content h4 { + font-size: 20px; + font-weight: 700; + margin-top: 5px; +} + +.faq .content p { + font-size: 15px; + color: #6c757d; +} + +.faq .accordion-item { + border: 0; + margin-bottom: 20px; + box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.06); + border-radius: 10px; +} + +.faq .accordion-item:last-child { + margin-bottom: 0; +} + +.faq .accordion-collapse { + border: 0; +} + +.faq .accordion-button { + padding: 20px 50px 20px 20px; + font-weight: 600; + border: 0; + font-size: 18px; + line-height: 24px; + color: var(--color-default); + text-align: left; + background: #fff; + box-shadow: none; + border-radius: 10px; +} + +.faq .accordion-button .num { + padding-right: 10px; + font-size: 20px; + line-height: 0; + color: var(--color-primary); +} + +.faq .accordion-button:not(.collapsed) { + color: var(--color-primary); + border-bottom: 0; + box-shadow: none; +} + +.faq .accordion-button:after { + position: absolute; + right: 20px; + top: 20px; +} + +.faq .accordion-body { + padding: 0 40px 30px 45px; + border: 0; + border-radius: 10px; + background: #fff; + box-shadow: none; +} + +/*-------------------------------------------------------------- +# Recent Blog Posts Section +--------------------------------------------------------------*/ +.recent-posts article { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + background-color: #fff; + padding: 30px; + height: 100%; + border-radius: 10px; + overflow: hidden; +} + +.recent-posts .post-img { + max-height: 240px; + margin: -30px -30px 15px -30px; + overflow: hidden; +} + +.recent-posts .post-category { + font-size: 16px; + color: #6f6f6f; + margin-bottom: 10px; +} + +.recent-posts .title { + font-size: 22px; + font-weight: 700; + padding: 0; + margin: 0 0 20px 0; +} + +.recent-posts .title a { + color: var(--color-default); + transition: 0.3s; +} + +.recent-posts .title a:hover { + color: var(--color-primary); +} + +.recent-posts .post-author-img { + width: 50px; + border-radius: 50%; + margin-right: 15px; +} + +.recent-posts .post-author { + font-weight: 600; + margin-bottom: 5px; +} + +.recent-posts .post-date { + font-size: 14px; + color: #3c3c3c; + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +# Contact Section +--------------------------------------------------------------*/ +.contact .info-container { + background-color: var(--color-primary); + height: 100%; + padding: 20px; + border-radius: 10px 0 0 10px; + box-shadow: 0px 2px 25px rgba(0, 0, 0, 0.1); +} + +.contact .info-item { + width: 100%; + background-color: #009282; + margin-bottom: 20px; + padding: 20px; + border-radius: 10px; + color: #fff; +} + +.contact .info-item:last-child { + margin-bottom: 0; +} + +.contact .info-item i { + font-size: 20px; + color: #fff; + float: left; + width: 44px; + height: 44px; + background-color: rgba(255, 255, 255, 0.2); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50px; + transition: all 0.3s ease-in-out; + margin-right: 15px; +} + +.contact .info-item h4 { + padding: 0; + font-size: 20px; + font-weight: 600; + margin-bottom: 5px; +} + +.contact .info-item p { + padding: 0; + margin-bottom: 0; + font-size: 14px; +} + +.contact .info-item:hover i { + background: #fff; + color: var(--color-primary); +} + +.contact .php-email-form { + width: 100%; + height: 100%; + background: #fff; + box-shadow: 0px 2px 25px rgba(0, 0, 0, 0.1); + padding: 30px; + border-radius: 0 10px 10px 0; +} + +.contact .php-email-form .form-group { + padding-bottom: 8px; +} + +.contact .php-email-form .error-message { + display: none; + color: #fff; + background: #df1529; + text-align: left; + padding: 15px; + font-weight: 600; +} + +.contact .php-email-form .error-message br+br { + margin-top: 25px; +} + +.contact .php-email-form .sent-message { + display: none; + color: #fff; + background: #059652; + text-align: center; + padding: 15px; + font-weight: 600; +} + +.contact .php-email-form .loading { + display: none; + background: #fff; + text-align: center; + padding: 15px; +} + +.contact .php-email-form .loading:before { + content: ""; + display: inline-block; + border-radius: 50%; + width: 24px; + height: 24px; + margin: 0 10px -6px 0; + border: 3px solid #059652; + border-top-color: #fff; + animation: animate-loading 1s linear infinite; +} + +.contact .php-email-form input, +.contact .php-email-form textarea { + border-radius: 0; + box-shadow: none; + font-size: 14px; +} + +.contact .php-email-form input[type=text], +.contact .php-email-form input[type=email], +.contact .php-email-form textarea { + padding: 12px 15px; +} + +.contact .php-email-form input[type=text]:focus, +.contact .php-email-form input[type=email]:focus, +.contact .php-email-form textarea:focus { + border-color: var(--color-primary); +} + +.contact .php-email-form textarea { + padding: 10px 12px; +} + +.contact .php-email-form button[type=submit] { + background: var(--color-primary); + border: 0; + padding: 14px 45px; + color: #fff; + transition: 0.4s; + border-radius: 50px; +} + +.contact .php-email-form button[type=submit]:hover { + background: rgba(0, 131, 116, 0.8); +} + +@keyframes animate-loading { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +/*-------------------------------------------------------------- +# Hero Section +--------------------------------------------------------------*/ +.hero { + width: 100%; + position: relative; + background: #016257; + padding: 60px 0 0 0; +} + +@media (min-width: 1365px) { + .hero { + background-attachment: fixed; + } +} + +.hero h2 { + font-size: 48px; + font-weight: 700; + margin-bottom: 20px; + color: #fff; +} + +.hero p { + color: rgba(255, 255, 255, 0.6); + font-weight: 400; + margin-bottom: 30px; +} + +.hero .btn-get-started { + font-family: var(--font-primary); + font-weight: 500; + font-size: 15px; + letter-spacing: 1px; + display: inline-block; + padding: 14px 40px; + border-radius: 50px; + transition: 0.3s; + color: #fff; + background: rgba(255, 255, 255, 0.1); + box-shadow: 0 0 15px rgba(0, 0, 0, 0.08); + border: 2px solid rgba(255, 255, 255, 0.1); +} + +.hero .btn-get-started:hover { + border-color: rgba(255, 255, 255, 0.5); +} + +.hero .btn-watch-video { + font-size: 16px; + transition: 0.5s; + margin-left: 25px; + color: #fff; + font-weight: 600; +} + +.hero .btn-watch-video i { + color: rgba(255, 255, 255, 0.5); + font-size: 32px; + transition: 0.3s; + line-height: 0; + margin-right: 8px; +} + +.hero .btn-watch-video:hover i { + color: #fff; +} + +@media (max-width: 640px) { + .hero h2 { + font-size: 36px; + } + + .hero .btn-get-started, + .hero .btn-watch-video { + font-size: 14px; + } +} + +.hero .icon-boxes { + padding-bottom: 60px; +} + +@media (min-width: 1200px) { + .hero .icon-boxes:before { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: calc(50% + 20px); + background-color: #016257; + } +} + +.hero .icon-box { + padding: 60px 30px; + position: relative; + overflow: hidden; + background: #008d7d; + box-shadow: 0 0 29px 0 rgba(0, 0, 0, 0.08); + transition: all 0.3s ease-in-out; + border-radius: 8px; + z-index: 1; + height: 100%; + width: 100%; + text-align: center; +} + +.hero .icon-box .title { + font-weight: 700; + margin-bottom: 15px; + font-size: 24px; +} + +.hero .icon-box .title a { + color: #fff; + transition: 0.3s; +} + +.hero .icon-box .icon { + margin-bottom: 20px; + padding-top: 10px; + display: inline-block; + transition: all 0.3s ease-in-out; + font-size: 48px; + line-height: 1; + color: rgba(255, 255, 255, 0.6); +} + +.hero .icon-box:hover { + background: #009786; +} + +.hero .icon-box:hover .title a, +.hero .icon-box:hover .icon { + color: #fff; +} + +/*-------------------------------------------------------------- +# Blog +--------------------------------------------------------------*/ +.blog .blog-pagination { + margin-top: 30px; + color: #555555; +} + +.blog .blog-pagination ul { + display: flex; + padding: 0; + margin: 0; + list-style: none; +} + +.blog .blog-pagination li { + margin: 0 5px; + transition: 0.3s; + border-radius: 10px; +} + +.blog .blog-pagination li a { + color: var(--color-default); + padding: 7px 16px; + display: flex; + align-items: center; + justify-content: center; +} + +.blog .blog-pagination li.active, +.blog .blog-pagination li:hover { + background: var(--color-primary); + color: #fff; +} + +.blog .blog-pagination li.active a, +.blog .blog-pagination li:hover a { + color: var(--color-white); +} + +/*-------------------------------------------------------------- +# Blog Posts List +--------------------------------------------------------------*/ +.blog .posts-list article { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + padding: 30px; + height: 100%; + border-radius: 10px; + overflow: hidden; +} + +.blog .posts-list .post-img { + max-height: 240px; + margin: -30px -30px 15px -30px; + overflow: hidden; +} + +.blog .posts-list .post-category { + font-size: 16px; + color: #555555; + margin-bottom: 10px; +} + +.blog .posts-list .title { + font-size: 22px; + font-weight: 700; + padding: 0; + margin: 0 0 20px 0; +} + +.blog .posts-list .title a { + color: var(--color-default); + transition: 0.3s; +} + +.blog .posts-list .title a:hover { + color: var(--color-primary); +} + +.blog .posts-list .post-author-img { + width: 50px; + border-radius: 50%; + margin-right: 15px; +} + +.blog .posts-list .post-author-list { + font-weight: 600; + margin-bottom: 5px; +} + +.blog .posts-list .post-date { + font-size: 14px; + color: #3c3c3c; + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +# Blog Details +--------------------------------------------------------------*/ +.blog .blog-details { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + padding: 30px; + border-radius: 10px; +} + +.blog .blog-details .post-img { + margin: -30px -30px 20px -30px; + overflow: hidden; + border-radius: 10px 10px 0 0; +} + +.blog .blog-details .title { + font-size: 28px; + font-weight: 700; + padding: 0; + margin: 20px 0 0 0; + color: var(--color-default); +} + +.blog .blog-details .content { + margin-top: 20px; +} + +.blog .blog-details .content h3 { + font-size: 22px; + margin-top: 30px; + font-weight: bold; +} + +.blog .blog-details .content blockquote { + overflow: hidden; + background-color: rgba(34, 34, 34, 0.06); + padding: 60px; + position: relative; + text-align: center; + margin: 20px 0; +} + +.blog .blog-details .content blockquote p { + color: var(--color-default); + line-height: 1.6; + margin-bottom: 0; + font-style: italic; + font-weight: 500; + font-size: 22px; +} + +.blog .blog-details .content blockquote:after { + content: ""; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 3px; + background-color: var(--color-secondary); + margin-top: 20px; + margin-bottom: 20px; +} + +.blog .blog-details .meta-top { + margin-top: 20px; + color: #6c757d; +} + +.blog .blog-details .meta-top ul { + display: flex; + flex-wrap: wrap; + list-style: none; + align-items: center; + padding: 0; + margin: 0; +} + +.blog .blog-details .meta-top ul li+li { + padding-left: 20px; +} + +.blog .blog-details .meta-top i { + font-size: 16px; + margin-right: 8px; + line-height: 0; + color: var(--color-primary); +} + +.blog .blog-details .meta-top a { + color: #6c757d; + font-size: 14px; + display: inline-block; + line-height: 1; +} + +.blog .blog-details .meta-bottom { + padding-top: 10px; + border-top: 1px solid rgba(34, 34, 34, 0.15); +} + +.blog .blog-details .meta-bottom i { + color: #555555; + display: inline; +} + +.blog .blog-details .meta-bottom a { + color: rgba(34, 34, 34, 0.8); + transition: 0.3s; +} + +.blog .blog-details .meta-bottom a:hover { + color: var(--color-primary); +} + +.blog .blog-details .meta-bottom .cats { + list-style: none; + display: inline; + padding: 0 20px 0 0; + font-size: 14px; +} + +.blog .blog-details .meta-bottom .cats li { + display: inline-block; +} + +.blog .blog-details .meta-bottom .tags { + list-style: none; + display: inline; + padding: 0; + font-size: 14px; +} + +.blog .blog-details .meta-bottom .tags li { + display: inline-block; +} + +.blog .blog-details .meta-bottom .tags li+li::before { + padding-right: 6px; + color: var(--color-default); + content: ","; +} + +.blog .blog-details .meta-bottom .share { + font-size: 16px; +} + +.blog .blog-details .meta-bottom .share i { + padding-left: 5px; +} + +.blog .post-author { + padding: 20px; + margin-top: 30px; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + border-radius: 10px; +} + +.blog .post-author img { + max-width: 120px; + margin-right: 20px; +} + +.blog .post-author h4 { + font-weight: 600; + font-size: 22px; + margin-bottom: 0px; + padding: 0; + color: var(--color-default); +} + +.blog .post-author .social-links { + margin: 0 10px 10px 0; +} + +.blog .post-author .social-links a { + color: rgba(34, 34, 34, 0.5); + margin-right: 5px; +} + +.blog .post-author p { + font-style: italic; + color: rgba(108, 117, 125, 0.8); + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +# Blog Sidebar +--------------------------------------------------------------*/ +.blog .sidebar { + padding: 30px; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + border-radius: 10px; +} + +.blog .sidebar .sidebar-title { + font-size: 20px; + font-weight: 700; + padding: 0; + margin: 0; + color: var(--color-default); +} + +.blog .sidebar .sidebar-item+.sidebar-item { + margin-top: 40px; +} + +.blog .sidebar .search-form form { + background: #fff; + border: 1px solid rgba(34, 34, 34, 0.3); + padding: 5px 10px; + position: relative; + border-radius: 50px; +} + +.blog .sidebar .search-form form input[type=text] { + border: 0; + padding: 4px; + border-radius: 50px; + width: calc(100% - 60px); +} + +.blog .sidebar .search-form form input[type=text]:focus { + outline: none; +} + +.blog .sidebar .search-form form button { + position: absolute; + top: 0; + right: 0; + bottom: 0; + border: 0; + background: none; + font-size: 16px; + padding: 0 25px; + margin: -1px; + background: var(--color-primary); + color: #fff; + transition: 0.3s; + border-radius: 50px; + line-height: 0; +} + +.blog .sidebar .search-form form button i { + line-height: 0; +} + +.blog .sidebar .search-form form button:hover { + background: rgba(0, 131, 116, 0.8); +} + +.blog .sidebar .categories ul { + list-style: none; + padding: 0; +} + +.blog .sidebar .categories ul li+li { + padding-top: 10px; +} + +.blog .sidebar .categories ul a { + color: var(--color-default); + transition: 0.3s; +} + +.blog .sidebar .categories ul a:hover { + color: var(--color-primary); +} + +.blog .sidebar .categories ul a span { + padding-left: 5px; + color: rgba(34, 34, 34, 0.4); + font-size: 14px; +} + +.blog .sidebar .recent-posts .post-item+.post-item { + margin-top: 15px; +} + +.blog .sidebar .recent-posts img { + width: 80px; + float: left; +} + +.blog .sidebar .recent-posts h4 { + font-size: 15px; + margin-left: 95px; + font-weight: bold; +} + +.blog .sidebar .recent-posts h4 a { + color: var(--color-default); + transition: 0.3s; +} + +.blog .sidebar .recent-posts h4 a:hover { + color: var(--color-primary); +} + +.blog .sidebar .recent-posts time { + display: block; + margin-left: 95px; + font-style: italic; + font-size: 14px; + color: rgba(34, 34, 34, 0.4); +} + +.blog .sidebar .tags { + margin-bottom: -10px; +} + +.blog .sidebar .tags ul { + list-style: none; + padding: 0; +} + +.blog .sidebar .tags ul li { + display: inline-block; +} + +.blog .sidebar .tags ul a { + color: #555555; + font-size: 14px; + padding: 6px 20px; + margin: 0 6px 8px 0; + border: 1px solid #d5d5d5; + display: inline-block; + transition: 0.3s; + border-radius: 50px; +} + +.blog .sidebar .tags ul a:hover { + color: #fff; + border: 1px solid var(--color-primary); + background: var(--color-primary); +} + +.blog .sidebar .tags ul a span { + padding-left: 5px; + color: rgba(85, 85, 85, 0.8); + font-size: 14px; +} + +/*-------------------------------------------------------------- +# Blog Comments +--------------------------------------------------------------*/ +.blog .comments { + margin-top: 30px; +} + +.blog .comments .comments-count { + font-weight: bold; +} + +.blog .comments .comment { + margin-top: 30px; + position: relative; +} + +.blog .comments .comment .comment-img { + margin-right: 14px; +} + +.blog .comments .comment .comment-img img { + width: 60px; +} + +.blog .comments .comment h5 { + font-size: 16px; + margin-bottom: 2px; +} + +.blog .comments .comment h5 a { + font-weight: bold; + color: var(--color-default); + transition: 0.3s; +} + +.blog .comments .comment h5 a:hover { + color: var(--color-primary); +} + +.blog .comments .comment h5 .reply { + padding-left: 10px; + color: var(--color-primary); +} + +.blog .comments .comment h5 .reply i { + font-size: 20px; +} + +.blog .comments .comment time { + display: block; + font-size: 14px; + color: rgba(34, 34, 34, 0.8); + margin-bottom: 5px; +} + +.blog .comments .comment.comment-reply { + padding-left: 40px; +} + +.blog .comments .reply-form { + margin-top: 30px; + padding: 30px; + box-shadow: 0 0 16px rgba(0, 0, 0, 0.1); + border-radius: 10px; +} + +.blog .comments .reply-form h4 { + font-weight: bold; + font-size: 22px; +} + +.blog .comments .reply-form p { + font-size: 14px; +} + +.blog .comments .reply-form input { + border-radius: 4px; + padding: 10px 10px; + font-size: 14px; +} + +.blog .comments .reply-form input:focus { + box-shadow: none; + border-color: rgba(0, 131, 116, 0.8); +} + +.blog .comments .reply-form textarea { + border-radius: 4px; + padding: 10px 10px; + font-size: 14px; +} + +.blog .comments .reply-form textarea:focus { + box-shadow: none; + border-color: rgba(0, 131, 116, 0.8); +} + +.blog .comments .reply-form .form-group { + margin-bottom: 25px; +} + +.blog .comments .reply-form .btn-primary { + border-radius: 50px; + padding: 14px 40px; + border: 0; + background-color: var(--color-secondary); +} + +.blog .comments .reply-form .btn-primary:hover { + background-color: rgba(248, 90, 64, 0.8); +} + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ +.footer { + font-size: 14px; + background-color: var(--color-primary); + padding: 50px 0; + color: white; +} + +.footer .footer-info .logo { + line-height: 0; + margin-bottom: 25px; +} + +.footer .footer-info .logo img { + max-height: 40px; + margin-right: 6px; +} + +.footer .footer-info .logo span { + font-size: 30px; + font-weight: 700; + letter-spacing: 1px; + color: #fff; + font-family: var(--font-primary); +} + +.footer .footer-info p { + font-size: 14px; + font-family: var(--font-primary); +} + +.footer .social-links a { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + border-radius: 50%; + border: 1px solid rgba(255, 255, 255, 0.2); + font-size: 16px; + color: rgba(255, 255, 255, 0.7); + margin-right: 10px; + transition: 0.3s; +} + +.footer .social-links a:hover { + color: #fff; + border-color: #fff; +} + +.footer h4 { + font-size: 16px; + font-weight: bold; + position: relative; + padding-bottom: 12px; +} + +.footer .footer-links { + margin-bottom: 30px; +} + +.footer .footer-links ul { + list-style: none; + padding: 0; + margin: 0; +} + +.footer .footer-links ul i { + padding-right: 2px; + color: rgba(0, 131, 116, 0.8); + font-size: 12px; + line-height: 0; +} + +.footer .footer-links ul li { + padding: 10px 0; + display: flex; + align-items: center; +} + +.footer .footer-links ul li:first-child { + padding-top: 0; +} + +.footer .footer-links ul a { + color: rgba(255, 255, 255, 0.7); + transition: 0.3s; + display: inline-block; + line-height: 1; +} + +.footer .footer-links ul a:hover { + color: #fff; +} + +.footer .footer-contact p { + line-height: 26px; +} + +.footer .copyright { + text-align: center; +} + +.footer .credits { + padding-top: 4px; + text-align: center; + font-size: 13px; +} + +.footer .credits a { + color: #fff; +} \ No newline at end of file diff --git a/assets/exo-mesos/1.jpg b/assets/exo-mesos/1.jpg new file mode 100644 index 0000000..6fb0680 Binary files /dev/null and b/assets/exo-mesos/1.jpg differ diff --git a/assets/exo-mesos/10.jpg b/assets/exo-mesos/10.jpg new file mode 100644 index 0000000..608ef48 Binary files /dev/null and b/assets/exo-mesos/10.jpg differ diff --git a/assets/exo-mesos/11.jpg b/assets/exo-mesos/11.jpg new file mode 100644 index 0000000..d849cd3 Binary files /dev/null and b/assets/exo-mesos/11.jpg differ diff --git a/assets/exo-mesos/12.jpg b/assets/exo-mesos/12.jpg new file mode 100644 index 0000000..d33c293 Binary files /dev/null and b/assets/exo-mesos/12.jpg differ diff --git a/assets/exo-mesos/13.jpg b/assets/exo-mesos/13.jpg new file mode 100644 index 0000000..aaf2d68 Binary files /dev/null and b/assets/exo-mesos/13.jpg differ diff --git a/assets/exo-mesos/14.jpg b/assets/exo-mesos/14.jpg new file mode 100644 index 0000000..7499f55 Binary files /dev/null and b/assets/exo-mesos/14.jpg differ diff --git a/assets/exo-mesos/15.jpg b/assets/exo-mesos/15.jpg new file mode 100644 index 0000000..39d6e5b Binary files /dev/null and b/assets/exo-mesos/15.jpg differ diff --git a/assets/exo-mesos/16.jpg b/assets/exo-mesos/16.jpg new file mode 100644 index 0000000..3cfe42f Binary files /dev/null and b/assets/exo-mesos/16.jpg differ diff --git a/assets/exo-mesos/17.jpg b/assets/exo-mesos/17.jpg new file mode 100644 index 0000000..48085c5 Binary files /dev/null and b/assets/exo-mesos/17.jpg differ diff --git a/assets/exo-mesos/18.jpg b/assets/exo-mesos/18.jpg new file mode 100644 index 0000000..9722023 Binary files /dev/null and b/assets/exo-mesos/18.jpg differ diff --git a/assets/exo-mesos/19.jpg b/assets/exo-mesos/19.jpg new file mode 100644 index 0000000..be6c819 Binary files /dev/null and b/assets/exo-mesos/19.jpg differ diff --git a/assets/exo-mesos/2.jpg b/assets/exo-mesos/2.jpg new file mode 100644 index 0000000..57b60c8 Binary files /dev/null and b/assets/exo-mesos/2.jpg differ diff --git a/assets/exo-mesos/20.jpg b/assets/exo-mesos/20.jpg new file mode 100644 index 0000000..936c50f Binary files /dev/null and b/assets/exo-mesos/20.jpg differ diff --git a/assets/exo-mesos/21.jpg b/assets/exo-mesos/21.jpg new file mode 100644 index 0000000..38c6e11 Binary files /dev/null and b/assets/exo-mesos/21.jpg differ diff --git a/assets/exo-mesos/3.jpg b/assets/exo-mesos/3.jpg new file mode 100644 index 0000000..055821c Binary files /dev/null and b/assets/exo-mesos/3.jpg differ diff --git a/assets/exo-mesos/4.jpg b/assets/exo-mesos/4.jpg new file mode 100644 index 0000000..e873e1d Binary files /dev/null and b/assets/exo-mesos/4.jpg differ diff --git a/assets/exo-mesos/6.jpg b/assets/exo-mesos/6.jpg new file mode 100644 index 0000000..4ee24aa Binary files /dev/null and b/assets/exo-mesos/6.jpg differ diff --git a/assets/exo-mesos/8-1.jpg b/assets/exo-mesos/8-1.jpg new file mode 100644 index 0000000..91543a9 Binary files /dev/null and b/assets/exo-mesos/8-1.jpg differ diff --git a/assets/exo-mesos/8.jpg b/assets/exo-mesos/8.jpg new file mode 100644 index 0000000..a34dc1d Binary files /dev/null and b/assets/exo-mesos/8.jpg differ diff --git a/assets/exo-mesos/9.jpg b/assets/exo-mesos/9.jpg new file mode 100644 index 0000000..b60ff28 Binary files /dev/null and b/assets/exo-mesos/9.jpg differ diff --git a/assets/favicon-16x16.png b/assets/favicon-16x16.png new file mode 100644 index 0000000..496bc0e Binary files /dev/null and b/assets/favicon-16x16.png differ diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png new file mode 100644 index 0000000..cc7d482 Binary files /dev/null and b/assets/favicon-32x32.png differ diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000..daf6be1 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/images/social/docs-about/about-stratos.png b/assets/images/social/docs-about/about-stratos.png new file mode 100644 index 0000000..369eec3 Binary files /dev/null and b/assets/images/social/docs-about/about-stratos.png differ diff --git a/assets/images/social/docs-about/changes.png b/assets/images/social/docs-about/changes.png new file mode 100644 index 0000000..25837c7 Binary files /dev/null and b/assets/images/social/docs-about/changes.png differ diff --git a/assets/images/social/docs-about/stratos-token-economy.png b/assets/images/social/docs-about/stratos-token-economy.png new file mode 100644 index 0000000..7a937a4 Binary files /dev/null and b/assets/images/social/docs-about/stratos-token-economy.png differ diff --git a/assets/images/social/docs-about/stratos-token-metrics.png b/assets/images/social/docs-about/stratos-token-metrics.png new file mode 100644 index 0000000..fe6856b Binary files /dev/null and b/assets/images/social/docs-about/stratos-token-metrics.png differ diff --git a/assets/images/social/docs-evm/available-dapps.png b/assets/images/social/docs-evm/available-dapps.png new file mode 100644 index 0000000..4ee6790 Binary files /dev/null and b/assets/images/social/docs-evm/available-dapps.png differ diff --git a/assets/images/social/docs-evm/deploy-smart-contracts/hardhat.png b/assets/images/social/docs-evm/deploy-smart-contracts/hardhat.png new file mode 100644 index 0000000..fed0d9b Binary files /dev/null and b/assets/images/social/docs-evm/deploy-smart-contracts/hardhat.png differ diff --git a/assets/images/social/docs-evm/deploy-smart-contracts/truffle.png b/assets/images/social/docs-evm/deploy-smart-contracts/truffle.png new file mode 100644 index 0000000..269abc9 Binary files /dev/null and b/assets/images/social/docs-evm/deploy-smart-contracts/truffle.png differ diff --git a/assets/images/social/docs-evm/node-config.png b/assets/images/social/docs-evm/node-config.png new file mode 100644 index 0000000..007cad2 Binary files /dev/null and b/assets/images/social/docs-evm/node-config.png differ diff --git a/assets/images/social/docs-evm/wallets/metamask/configure-on-metamask.png b/assets/images/social/docs-evm/wallets/metamask/configure-on-metamask.png new file mode 100644 index 0000000..1c994ed Binary files /dev/null and b/assets/images/social/docs-evm/wallets/metamask/configure-on-metamask.png differ diff --git a/assets/images/social/docs-evm/wallets/metamask/gas-token.png b/assets/images/social/docs-evm/wallets/metamask/gas-token.png new file mode 100644 index 0000000..d1f350e Binary files /dev/null and b/assets/images/social/docs-evm/wallets/metamask/gas-token.png differ diff --git a/assets/images/social/docs-evm/wallets/metamask/hello.png b/assets/images/social/docs-evm/wallets/metamask/hello.png new file mode 100644 index 0000000..9e52b05 Binary files /dev/null and b/assets/images/social/docs-evm/wallets/metamask/hello.png differ diff --git a/assets/images/social/docs-evm/wallets/metamask/multiple-accounts.png b/assets/images/social/docs-evm/wallets/metamask/multiple-accounts.png new file mode 100644 index 0000000..251711d Binary files /dev/null and b/assets/images/social/docs-evm/wallets/metamask/multiple-accounts.png differ diff --git a/assets/images/social/docs-resource-node/ppd-terminal-subcommands.png b/assets/images/social/docs-resource-node/ppd-terminal-subcommands.png new file mode 100644 index 0000000..7336738 Binary files /dev/null and b/assets/images/social/docs-resource-node/ppd-terminal-subcommands.png differ diff --git a/assets/images/social/docs-resource-node/rpc-client.png b/assets/images/social/docs-resource-node/rpc-client.png new file mode 100644 index 0000000..b653df0 Binary files /dev/null and b/assets/images/social/docs-resource-node/rpc-client.png differ diff --git a/assets/images/social/docs-resource-node/sds-ipfs-handbook.png b/assets/images/social/docs-resource-node/sds-ipfs-handbook.png new file mode 100644 index 0000000..d5a51be Binary files /dev/null and b/assets/images/social/docs-resource-node/sds-ipfs-handbook.png differ diff --git a/assets/images/social/docs-resource-node/sds-rpc-for-file-operation.png b/assets/images/social/docs-resource-node/sds-rpc-for-file-operation.png new file mode 100644 index 0000000..b2bf53e Binary files /dev/null and b/assets/images/social/docs-resource-node/sds-rpc-for-file-operation.png differ diff --git a/assets/images/social/docs-resource-node/sds-update-v12.png b/assets/images/social/docs-resource-node/sds-update-v12.png new file mode 100644 index 0000000..da25bc9 Binary files /dev/null and b/assets/images/social/docs-resource-node/sds-update-v12.png differ diff --git a/assets/images/social/docs-resource-node/sds-video-streaming-handbook.png b/assets/images/social/docs-resource-node/sds-video-streaming-handbook.png new file mode 100644 index 0000000..bef89ff Binary files /dev/null and b/assets/images/social/docs-resource-node/sds-video-streaming-handbook.png differ diff --git a/assets/images/social/docs-resource-node/setup-and-run-a-sds-resource-node.png b/assets/images/social/docs-resource-node/setup-and-run-a-sds-resource-node.png new file mode 100644 index 0000000..69f2dba Binary files /dev/null and b/assets/images/social/docs-resource-node/setup-and-run-a-sds-resource-node.png differ diff --git a/assets/images/social/docs-stratos-chain/how-to-become-a-validator.png b/assets/images/social/docs-stratos-chain/how-to-become-a-validator.png new file mode 100644 index 0000000..b665fc1 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/how-to-become-a-validator.png differ diff --git a/assets/images/social/docs-stratos-chain/how-to-setup-rest-grpc-full-chain.png b/assets/images/social/docs-stratos-chain/how-to-setup-rest-grpc-full-chain.png new file mode 100644 index 0000000..6f8147a Binary files /dev/null and b/assets/images/social/docs-stratos-chain/how-to-setup-rest-grpc-full-chain.png differ diff --git a/assets/images/social/docs-stratos-chain/how-to-start-with-state-sync.png b/assets/images/social/docs-stratos-chain/how-to-start-with-state-sync.png new file mode 100644 index 0000000..c202173 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/how-to-start-with-state-sync.png differ diff --git a/assets/images/social/docs-stratos-chain/mainnet-bridge.png b/assets/images/social/docs-stratos-chain/mainnet-bridge.png new file mode 100644 index 0000000..9da3b67 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/mainnet-bridge.png differ diff --git a/assets/images/social/docs-stratos-chain/mainnet-staking.png b/assets/images/social/docs-stratos-chain/mainnet-staking.png new file mode 100644 index 0000000..a8a3aea Binary files /dev/null and b/assets/images/social/docs-stratos-chain/mainnet-staking.png differ diff --git a/assets/images/social/docs-stratos-chain/network.png b/assets/images/social/docs-stratos-chain/network.png new file mode 100644 index 0000000..878e457 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/network.png differ diff --git a/assets/images/social/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node.png b/assets/images/social/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node.png new file mode 100644 index 0000000..7652734 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node.png differ diff --git a/assets/images/social/docs-stratos-chain/stchaind-commands-part-1.png b/assets/images/social/docs-stratos-chain/stchaind-commands-part-1.png new file mode 100644 index 0000000..3a82137 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/stchaind-commands-part-1.png differ diff --git a/assets/images/social/docs-stratos-chain/stchaind-commands-part-2.png b/assets/images/social/docs-stratos-chain/stchaind-commands-part-2.png new file mode 100644 index 0000000..429158d Binary files /dev/null and b/assets/images/social/docs-stratos-chain/stchaind-commands-part-2.png differ diff --git a/assets/images/social/docs-stratos-chain/stratos-chain-grpc-queries.png b/assets/images/social/docs-stratos-chain/stratos-chain-grpc-queries.png new file mode 100644 index 0000000..ab508f1 Binary files /dev/null and b/assets/images/social/docs-stratos-chain/stratos-chain-grpc-queries.png differ diff --git a/assets/images/social/docs-stratos-chain/stratos-chain-rest-apis.png b/assets/images/social/docs-stratos-chain/stratos-chain-rest-apis.png new file mode 100644 index 0000000..ac7430a Binary files /dev/null and b/assets/images/social/docs-stratos-chain/stratos-chain-rest-apis.png differ diff --git a/assets/images/social/get-started.png b/assets/images/social/get-started.png new file mode 100644 index 0000000..bf4898c Binary files /dev/null and b/assets/images/social/get-started.png differ diff --git a/assets/images/social/index.png b/assets/images/social/index.png new file mode 100644 index 0000000..5152336 Binary files /dev/null and b/assets/images/social/index.png differ diff --git a/assets/img/android-chrome-192x192.png b/assets/img/android-chrome-192x192.png new file mode 100644 index 0000000..0e5a6c3 Binary files /dev/null and b/assets/img/android-chrome-192x192.png differ diff --git a/assets/img/android-chrome-512x512.png b/assets/img/android-chrome-512x512.png new file mode 100644 index 0000000..2b371be Binary files /dev/null and b/assets/img/android-chrome-512x512.png differ diff --git a/assets/img/apple-touch-icon.png b/assets/img/apple-touch-icon.png new file mode 100644 index 0000000..9cbd4bb Binary files /dev/null and b/assets/img/apple-touch-icon.png differ diff --git a/assets/img/favicon-16x16.png b/assets/img/favicon-16x16.png new file mode 100644 index 0000000..192458f Binary files /dev/null and b/assets/img/favicon-16x16.png differ diff --git a/assets/img/favicon-32x32.png b/assets/img/favicon-32x32.png new file mode 100644 index 0000000..ccfc863 Binary files /dev/null and b/assets/img/favicon-32x32.png differ diff --git a/assets/img/hero-img.png b/assets/img/hero-img.png new file mode 100644 index 0000000..22db7d4 Binary files /dev/null and b/assets/img/hero-img.png differ diff --git a/assets/img/logo.png b/assets/img/logo.png new file mode 100644 index 0000000..8a8c32a Binary files /dev/null and b/assets/img/logo.png differ diff --git a/assets/javascripts/bundle.ad660dcc.min.js b/assets/javascripts/bundle.ad660dcc.min.js new file mode 100644 index 0000000..0ffc046 --- /dev/null +++ b/assets/javascripts/bundle.ad660dcc.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var O=f()(_);return u("cut"),O},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(j,"px"),O.setAttribute("readonly",""),O.value=V,O}var te=function(_,O){var j=A(_);O.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,O):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,O):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(O){return typeof O}:H=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},H(V)}var mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=_.action,j=O===void 0?"copy":O,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(O){return typeof O}:Ie=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var O=0;O<_.length;O++){var j=_[O];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,O){return _&&ro(V.prototype,_),O&&ro(V,O),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(O){return O.__proto__||Object.getPrototypeOf(O)},Wt(V)}function vr(V,_){var O="data-clipboard-".concat(V);if(_.hasAttribute(O))return _.getAttribute(O)}var Ri=function(V){Ci(O,V);var _=Hi(O);function O(j,D){var Y;return _i(this,O),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(O,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),O}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ft(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ft(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=bt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(gt);var me=new Mo(Oo);var M=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[ht])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return M}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),B(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(E(r=>r.observe(t)),v(r=>Go.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),v(t=>en.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(v(t=>t?M:e))}function xe(){return new URL(location.href)}function pt(e,t=!1){if(G("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),b(t=>t.length>0),B(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():M))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),B(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),B(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),B(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),B(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function G(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!G("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,c)," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);G("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Sn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Mn(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:M),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),ee(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?M:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):M})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),G("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||G("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:M)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return G("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),B(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),Na(n).pipe(E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>G("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(v(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!G("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(b(()=>G("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?M:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),B(1))}function Kn(e){let t=$("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):M}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),M}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return M;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),v(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),M)))),v(Xn),v(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),s.pipe(v(()=>e),Z("pathname"),v(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>d(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),ee(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?M:(i.preventDefault(),I(p))}}return M}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),B(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),B(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),v(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),v(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>M),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return M}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>M),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),B(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),v(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),G("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return G("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),st({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),st({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>$(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title")))})).subscribe(),e.pipe(v(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(v(()=>$(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(v(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),b(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),B(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;G("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Qn(e,{viewport$:Oe,header$:rt})),B(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>G("search.highlight")?mi(e,{index$:Mi,location$:jt}):M),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(v(()=>hs),Pe(ds),B(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.ad660dcc.min.js.map + diff --git a/assets/javascripts/bundle.ad660dcc.min.js.map b/assets/javascripts/bundle.ad660dcc.min.js.map new file mode 100644 index 0000000..6d61170 --- /dev/null +++ b/assets/javascripts/bundle.ad660dcc.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +
+
+
    +
  • IMPORTANT: Before proceding, make sure to download and install the latest version of Stratos Network Wallet [Download]
  • +
  • IMPORTANT: Never send STOS directly from Ethereum network to a Stratos wallet. Migration has to go through the bridge app or else the tokens will be lost.
  • +
  • The bridge web app is only available for Metamask.
  • +
  • STOS tokens have to be on ETH network and you need some ETH for gas fees.
  • +
  • If your tokens are on a CEX (other than Gate.io), you need to withdraw them to Metamask first. If your tokens are on Gate.io, you might be interested in withdrawing directly from Gate to Stratos Network (tutorial here).
  • +
  • If in doubt, please use telegram or discord to ask for assistance (links at the bottom of the page). Or, at least, send a small test transaction first, the fee will be worth the trouble if something is wrong.
  • +
+
+
+

WARNING

+

The ONLY URL for the bridge is:

+

app.exoswap.io

+

Always check the URL and beware of scammers!

+
+
+

Ethereum to Stratos🔗︎

+
    +
  • Make sure your Metamask wallet has STOS tokens as ERC-20 and some ETH for gas fee. Next, open the bridge URL and connect the wallet.
  • +
+

+
    +
  • Enter the amount of STOS you want to bridge and click Approve.
  • +
+

+
    +
  • Approve a spending limit. Make sure you set the limit at least equal to the amount you want to bridge.
  • +
+

+
    +
  • Once the spending limit is approved, initiate the transfer. This process could take aprox. 2-3 minutes.
  • +
+

+
    +
  • Next, you need to add the Stratos Network details to Metamask. Click the upper left button and then click Add Network.
  • +
+

+
    +
  • In the next screen, enter the following details:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Setting NameValue
Network nameStratos
New RPC URLhttps://web3-rpc.thestratos.org
Chain ID2048
Currency symbolSTOS
Block Explorer URLhttps://web3-explorer.thestratos.org
+

+
    +
  • Your STOS tokens should now be visible on the Stratos network.
  • +
+

+
+

Stratos to Ethereum🔗︎

+

Migrating back to Ethereum network is basically the same process, but backwards.

+
    +
  1. +

    Open Metamask and make sure it's connected to Stratos Network.

    +
  2. +
  3. +

    Once you see your STOS tokens in Metamask (connected to Stratos), open ExoSwap.

    +
  4. +
  5. +

    Change the order of the operation using the switch button in the middle and make sure the first chain is set to Stratos:

    +

    +
  6. +
  7. +

    Start the transfer process.

    +
  8. +
+
+

Warning

+

Fees for bridging from Stratos to Ethereum are quite high (out of our control, it's what Ethereum network is charging) so alternatively, you could use the migration option through Gate.io.

+
+
+


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/mainnet-staking/index.html b/docs-stratos-chain/mainnet-staking/index.html new file mode 100644 index 0000000..04c993e --- /dev/null +++ b/docs-stratos-chain/mainnet-staking/index.html @@ -0,0 +1,1997 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + HowTo Stake STOS on Stratos Mainnet - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +

Introduction🔗︎

+
    +
  • IMPORTANT: Before proceding, make sure to download and install the latest version of Stratos Network Wallet [Download].
  • +
  • If your tokens are on the ETH network or on a CEX, you need to bridge them to Stratos Network tutorial here.
  • +
  • If in doubt, please use telegram or discord to ask for assistance.
  • +
  • Please choose carefully your staking metwork (Stratos Wallet OR MetaMask) as you won't be able to import one wallet into another (they are using different type of seed phrase). The only way to switch from a wallet type to another is by unstaking and then sending the tokens to the other wallet type, but that will take 21 days.
  • +
+
+
+

WARNING

+

The ONLY URL for the bridge and staking is:

+

app.exoswap.io

+

Always check the URL and beware of scammers!

+
+
+

Using Stratos Wallet🔗︎

+
    +
  • +

    Go to thestratos.org/stratos-network-wallet and download the Stratos Wallet.

    +
  • +
  • +

    Import an existing wallet address or generate a new one. To generate a new one, click Create or Import Wallet and the click Generate new Mnemonic button to generate a new seed phrase.

    +
  • +
+
+

Please keep your seed phrase in a safe location. You won't be able to retrieve it again from the wallet application!

+
+

+
    +
  • Copy the wallet address in the st1ABC format by clicking the copy button.
  • +
+

+ +

Next, copy the translated address in the 0xABC form.

+

+
    +
  • Go to Metamask and transfer STOS tokens to the 0xABC address.
  • +
+

+
    +
  • +

    Go back to your Stratos Wallet and click the refresh balance button. You should see your tokens there.

    +
  • +
  • +

    Next, go to the Reward tab and choose a validator. Click Delegate next to it and stake your coins.

    +
  • +
+

+
    +
  • Your tokens are now staked.
  • +
+

You can check back from time to time and withdraw your rewards by clicking on the Get all rewards button.

+
+

Unstake with Stratos Wallet🔗︎

+
    +
  • To unstake your tokens, open the Stratos Wallet, go to Send Transaction, choose transaction type Undelegate, select the validator you want to unstake from, enter amount and generate the transaction.
  • +
+

+
+

Warning

+

There is a 21 days cool-down period so you will receive your unstaked coins back into your wallet after 21 days.

+
+
+

Using MetaMask🔗︎

+
    +
  • +

    To stake your STOS tokens to a validator on Stratos Chain using MetaMask, your STOS tokens must be on the Stratos Network and your MetaMask must be connected to Stratos Chain.

    +
  • +
  • +

    Once you completed the Ethereum to Stratos bridge, you should find your STOS tokens in your MetaMask account connected to Stratos Network.

    +
  • +
+

+
    +
  • Open app.exoswap.io. Navigate to Staking and connect your MetaMask wallet.
  • +
+

+
    +
  • Choose any validator in the list and enter the desired amount of tokens you would want to stake, then press Delegate.
  • +
+
+

Do not use MAX, leave at least 0.01 STOS in balance to cover the transaction fees.

+
+

+
    +
  • Confirm the transaction.
  • +
+

+
    +
  • +

    Your STOS is now delegated and earning staking rewards.

    +
  • +
  • +

    You can claim the rewards anytime and re-stake them but always remember to leave a small amount to cover for the transaction fees.

    +
  • +
+

+
+

Unstake with MetaMask🔗︎

+
    +
  • +

    Open app.exoswap.io. Navigate to Staking and connect your MetaMask wallet.

    +
  • +
  • +

    Open the validator you staked to and click on the drop down menu under amount details and select Undelegate.

    +
  • +
+

+
    +
  • +

    Select the amount of tokens you want to undelegate and press the Undelegate button to process the transaction.

    +
  • +
  • +

    MetaMask will ask you to confirm the transaction.

    +
  • +
+

+
    +
  • After 21 days, you will receive your rewards back in your balance.
  • +
+
+
+

Please keep in mind

+
    +
  • +

    A validator's voting power will NOT affect your earning potential. Your earning will be the same, regardless of the validator you chose.

    +
  • +
  • +

    The only thing influencing your rewards if the commission amount each validator is charging.

    +
  • +
  • +

    For the sake of decentralization, we should all make sure we keep our validators` Voting Power as equal as possible.

    +
  • +
  • +

    Your staking rewards can be withdrawn at any time but your staking DEPOSIT has a 21 days lock-down period.

    +
  • +
+
+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/network/index.html b/docs-stratos-chain/network/index.html new file mode 100644 index 0000000..2189792 --- /dev/null +++ b/docs-stratos-chain/network/index.html @@ -0,0 +1,1827 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Network - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +

Network

+ +

Network details🔗︎

+
+
+
+

The documentation corresponding contains details for the RPC - HTTP, WS endpoints. There is also a full node setup if you wish to setup your own full node.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ServiceDetails
RPChttps://rpc.thestratos.org/
RESThttps://rest.thestratos.org/
gRPChttps://grpc.thestratos.org/
Block Explorerhttps://explorer.thestratos.org/
+
+
+

Mesos Testnet replicates the Stratos Mainnet, which is to be used for testing. Testnet coins are separate and distinct from actual tokens/assets, and are never supposed to have any value. This allows application developers or validators/testers to experiment, without having to use real assets or worrying about breaking the main Stratos chain.

+

The documentation corresponding contains details for the RPC - HTTP, WS endpoints. There is also a full node setup if you wish to setup your own full node.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ServiceDetails
RPChttps://rpc-mesos.thestratos.org/
RESThttps://rest-mesos.thestratos.org/
Faucethttps://faucet-mesos.thestratos.org/
Block Explorerhttps://explorer-mesos.thestratos.org/
+
+
+
+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/index.html b/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/index.html new file mode 100644 index 0000000..a835bad --- /dev/null +++ b/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/index.html @@ -0,0 +1,2908 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Full-Chain Node - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Full-Chain Node

+ +

Introduction🔗︎

+

Stratos blockchain facilitates all decentralized ledger transactions and functionalities, providing settlement services and related financial payment services for network providers and network users in an efficient, fair and transparent manner.

+

The Stratos-chain full-nodes are dedicated servers with sufficient computing power that participate in block generation cycle. It is necessary in order to be a validator.

+

In practice, running a full-node only implies running a non-compromised and up-to-date version of the software with low network latency and without downtime. It is encouraged to run a full-node even if you do not plan to be a validator.

+

The Stratos-chain validator is a full-node that participates in the Stratos Chain block generation cycle and also voting for the validity of a block proposed.

+


+
+

Requirements🔗︎

+

Here are the required hardware/software to run a Stratos-chain full-node:

+

Minimum Hardware Requirements

+ + + + + + + + + + + + + + + + + +
CPURAMStorageStake
8 Cores¹, 2.5GHz²32 GB2 TB1 STOS³
+

¹    Can be achieved using dual CPU server configurations (eg. 2cpu x 8cores, as long as the frequency per core is respected).
+²    2.5GHz refers to Base Frequency, not Turbo/Boost Frequency.
+³    Minimum stake is 1 stos until all 100 validator spots are filled. After that, is marked decided.

+

Software (tested version)

+
    +
  • Ubuntu 18.04+
  • +
  • Go 1.20+ linux/amd64
  • +
+


+
+

Setup Environment🔗︎

+

In order to run a Stratos-chain full-node, you may need to build stratos-chain source code yourself which requires Go 1.19+, git, curl and make installed.

+

This process depends on your operating system.

+


+

Linux Users🔗︎

+

The following example is based on Ubuntu 18.04+ 64-bit(Debian) and assumes you are using a terminal environment by default.

+

Please run the equivalent commands if you are running other Linux distributions.

+
# Update the system
+sudo apt update
+sudo apt upgrade
+
+# Install git, snap and make(you can also install them separately as your needs)
+sudo apt install git build-essential curl tmux libgmp3-dev flex bison --yes
+
+# Install PBC library
+wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz
+tar xfz pbc-0.5.14.tar.gz && cd pbc-0.5.14
+./configure
+make
+sudo make install
+sudo ldconfig
+
+


+

Windows Users🔗︎

+

It is possible to build and run the software on Windows. However, we did not test it on Windows completely.

+

It may give you unexpected results, or it may require additional setup.

+

An alternative option is to install a separate virtual Linux system using VirtualBox or VMware Workstation.

+


+
+

Setup a Stratos-chain full-node🔗︎

+


+

Create a user account🔗︎

+

To create a separated and more secure environment, it is recommended to create a separated user account stratos to run your node.

+
sudo adduser stratos --home /home/stratos
+
+

Once the user account stratos is created, switch and login the system using stratos. You will proceed with the following steps in context of that user.

+


+

Get release files🔗︎

+
+

Tip

+

There are two ways to get the these binary executables:

+
    +
  • Download pre-compiled executabled (for Ubuntu 18.04+ x86_64).
  • +
  • Download source code and compile it yourself.
  • +
+

Please choose only one of them based on your operating system.

+
+


+

Pre-compiled executables🔗︎

+

The following binary stchaind has been built and ready to be downloaded directly.

+
# Make sure we are inside the $HOME folder
+cd $HOME
+wget https://github.com/stratosnet/stratos-chain/releases/download/v0.12.0/stchaind
+
+


+
    +
  • Check the granularity
  • +
+
# Make sure we are inside the $HOME folder and check these two binary executables
+cd $HOME
+
+# Check granularity
+md5sum stchaind
+
+## Expected output
+## 0d4a0fd5173fa273f6150b28e48086a3  stchaind
+
+


+
    +
  • Add execute permission to this binary
  • +
+
# Make sure the file can be executed
+chmod +x stchaind
+
+


+
    +
  • Add the binary to the search path
  • +
+
mkdir ~/bin 
+echo 'export PATH="$HOME/bin:$PATH"' >> ~/.profile 
+source ~/.profile
+mv stchaind ~/bin 
+
+
    +
  • Verify installation
  • +
+
stchaind version
+
+# Should return v0.12.0
+
+
+

Tip

+

💡 This binary is built for Ubuntu 18.04+ amd64. if you have other Linux kernels or you have any issues with the pre-compiled binary please, follow the next step to build your own binary from source code.

+

Otherwise, continue with Networks.

+
+


+

Compile the source code🔗︎

+

Before the following steps, please make sure you have Go 1.19+ installed .

+
# Check if go is already installed:
+go version
+
+# If it's not, you can install it with snapd:
+sudo apt install snapd
+sudo snap install go --classic
+
+

Alternatively, you can follow the official instructions: link

+


+
    +
  • Build the extracted source code
  • +
+
git clone https://github.com/stratosnet/stratos-chain.git
+cd stratos-chain
+git checkout tags/v0.12.0
+make build
+
+


+
    +
  • Installing the binary executable
  • +
+
mkdir ~/bin 
+echo 'export PATH="$HOME/bin:$PATH"' >> ~/.profile 
+source ~/.profile
+cp build/stchaind ~/bin 
+
+
    +
  • Verify installation
  • +
+
stchaind version
+
+# Should return v0.12.0
+
+


+
+

Networks🔗︎

+
+

Currently, there are two live blockchains you can join:

+
    +
  • +

    Mainnet (Stratos) which is using real tokens and it's a production environment.

    +
  • +
  • +

    Testnet (Mesos) which is using test tokens. You can setup a validator here at first if you want to test your system, see how things work, etc, without the risk of losing real tokens if something goes wrong.

    +
  • +
  • +

    This guide applies to both, with a few small differences:

    +
  • +
+ + + + + + + + + + + + + + + + + + + + +
Variable⤵MainnetTestnet
chain-idstratos-1mesos-1
keyring-backendfile / os / passtest
+
+

keyring-backend🔗︎

+
+

On Testnet, the keyring's backend is test, i.e., --keyring-backend=test

+
    +
  • The test backend is a password-less variation of the file backend. Keys are stored unencrypted on disk.
  • +
+

On Mainnet, the keyring's backend can be file, os or pass e.g., --keyring-backend=file

+
    +
  • The file backend stores the keyring encrypted within the app's configuration directory. This keyring will request a password each time it is accessed. (Recommended)
  • +
  • The os backend relies on operating system-specific defaults to handle key storage securely since operating system's default credentials managers are designed to meet users' most common needs and provide them with a comfortable experience without compromising on security.
  • +
  • The pass backend uses the pass utility to manage on-disk encryption of keys' sensitive data and metadata. Keys are stored inside gpg encrypted files within app-specific directories. More info at passwordstore.org
  • +
+
+
+

Initialize the node🔗︎

+
# Make sure we are inside the home directory
+cd $HOME
+
+# Create folders and initialize the node
+stchaind init "<your_node_moniker>" --chain-id <network_chain_id>
+
+# ignore the output since you need to download the genesis file 
+
+
+

💡 You can choose any your_node_moniker. This will be your node name.

+

💡 network_chain_id is stratos-1 for Mainnet or mesos-1 for Testnet. See Networks.

+
+


+
    +
  • Download the genesis.json and config.toml files
  • +
+
+
+
+
wget https://raw.githubusercontent.com/stratosnet/mainnet/main/genesis/genesis.json
+wget https://raw.githubusercontent.com/stratosnet/mainnet/main/config.toml
+
+
+
+
wget https://raw.githubusercontent.com/stratosnet/stratos-chain-testnet/main/genesis.json
+wget https://raw.githubusercontent.com/stratosnet/stratos-chain-testnet/main/config.toml
+
+
+
+
+
+

💡 We strongly recommend using this downloaded config.toml for v0.12.0, instead of the ones for previous versions to avoid any mismatching.

+
+


+
    +
  • Change moniker in the downloaded config.toml file
  • +
+

Please change your node moniker by modifying the config.toml file. Open this file with an editor, search moniker (usually at Line #18) in the file to find the “moniker” field.

+

Change it to any value you like. It’s your node name that will show on the network.

+

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

+
    +
  • Move the downloaded config.toml and genesis.json files to stchaind folder (default in $HOME/.stchaind/config/). Replace if you already have these files.
  • +
+
mv config.toml $HOME/.stchaind/config/
+mv genesis.json $HOME/.stchaind/config/
+
+


+
+

Directory structure🔗︎

+

After you finished the above steps, your $HOME folder should include the following directories and files.

+
.
+├── ...
+├── .stchaind
+│   ├── config
+│   │   ├── app.toml
+│   │   ├── config.toml
+│   │   ├── genesis.json
+│   │   ├── node_key.json
+│   │   └── priv_validator_key.json
+│   ├── data
+│   │    └── priv_validator_state.json 
+│   └── keyring-test
+├── ...
+
+
+

Tip

+

💡 By default, directory .stchaind will be created in the $HOME folder. The .stchaind folder contains the nodes` configurations and data.

+
+


+
+

Start the full-chain node🔗︎

+
+

Tip

+

Joining the network at a later time will require your node to download all the past blocks which, depending on how far ahead the network is, could take hours or even days.

+

Stratos Chain now supports StateSync which enables your node to use a snapshot of the current chain and start the sync from there, which will only take a couple of minutes.

+

You can find the StateSync Doc here.

+
+

There are three ways to run your Stratos-chain full-node.

+

Please choose ONE of them to start the node.

+


+

In foreground🔗︎

+
# Make sure we are inside the home directory
+cd $HOME
+
+# run your node
+stchaind start
+
+# Use `Ctrl+c` to stop the node.
+
+


+

In background🔗︎

+
# Make sure we are inside the home directory
+cd $HOME
+
+# run your node in backend
+tmux new -s stchaind
+stchaind start 
+
+

Use the following Linux Command to stop your node.

+
pkill stchaind
+
+


+

As service🔗︎

+

All below steps require root privileges

+


+
    +
  • Create the service file
  • +
+

Create the /lib/systemd/system/stratos.service file with the following content

+
[Unit]
+Description=Stratos Chain Node
+After=network-online.target
+
+[Service]
+User=stratos
+ExecStart=/home/stratos/stchaind start --home=/home/stratos/.stchaind
+Restart=on-failure
+RestartSec=3
+LimitNOFILE=8192
+
+[Install]
+WantedBy=multi-user.target
+
+
+

Tip

+

💡 In the [service] section:

+
    +
  • User is your system login username
  • +
  • ExecStart designates the absolute path to the binary stchaind
  • +
  • --home is the absolute path to your node folder.
  • +
  • We used the default values for these variables. If you use a different username, group or folder to hold your node data instead of the default values, please modify these values according to your situations. Make sure the above values are correct.
  • +
+
+


+
    +
  • Start your service
  • +
+

Once you have successfully created the service, you need to enable and start it by running

+
systemctl daemon-reload
+systemctl enable stratos.service
+systemctl start stratos.service
+
+


+

Service operations🔗︎

+
    +
  • Check the service status
  • +
+
systemctl status stratos.service
+
+
    +
  • Check service log
  • +
+
journalctl -u stratos.service -f 
+
+# exit with ctrl+c
+
+
    +
  • Stop the service
  • +
+
systemctl stop stratos.service
+
+


+
+

Check node status🔗︎

+

Once you start your full-node, it will connect to the peers and start syncing. You can check the status of the node by running the following command

+
# Check the status of the node
+stchaind status
+
+

The output will be similar to

+
stchaind status
+{
+    "NodeInfo": {
+        "protocol_version": {
+            "p2p": "8",
+            "block": "11",
+            "app": "0"
+        },
+        "id": "16a0758d175cbf5c08d41dffa73eb5c0190869ed",
+        "listen_addr": "tcp://0.0.0.0:26656",
+        "network": "test-chain",
+        "version": "0.37.4",
+        "channels": "40202122233038606100",
+        "moniker": "node",
+        "other": {
+            "tx_index": "on",
+            "rpc_address": "tcp://127.0.0.1:26657"
+        }
+    },
+    "SyncInfo": {
+        "latest_block_hash": "697A2DB243E5191C6D85285A2ADD4924526924969C6C70FE71827C9FE41D4373",
+        "latest_app_hash": "E978F87BB23D351B853F5F0CF9FBBBA4464FF5D7CE3746BF3E2357F28CBCE041",
+        "latest_block_height": "497",
+        "latest_block_time": "2023-01-11T01:10:37.562405326Z",
+        "earliest_block_hash": "139676534FECFA507D56A06B03BD528E70ACA6D4DB6560219707011966613DE4",
+        "earliest_app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+        "earliest_block_height": "1",
+        "earliest_block_time": "2023-01-09T17:08:58.4890503Z",
+        "catching_up": false
+    },
+    "ValidatorInfo": {
+        "Address": "18A7169C1B427D994133F7B3D4504E92789DB37C",
+        "PubKey": {
+            "type": "tendermint/PubKeyEd25519",
+            "value": "69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo="
+        },
+        "VotingPower": "500000"
+    }
+}
+
+

If the catching_up value is false in the sync_info section, it means that you are fully synced.

+

If it is true, it means your node is still syncing.

+


+
+

Setup a wallet🔗︎

+

Once the node finishes catch-up, you are ready to operate your node for various transactions(tx) and queries.

+

In order to hold the tokens that you will later delegate to your validator node, or pay staking for your SDS resource node, first, you need to create a local wallet account.

+


+

Create a new wallet🔗︎

+

To create a new wallet account, type the following command

+
stchaind keys add <your wallet name> --hd-path="m/44'/606'/0'/0/0" --keyring-backend=<your chosen keyring backend>
+
+
+

Tip

+

💡 Choose a keyring-backend suited for the network you are running this chain installation on. See keyring-backend.

+

💡 Enter a wallet name that you will easily remember. This name will be used inside other commands later.

+
+

After creating a new local wallet account, you will get its address and pubkey.

+

In addition, you will have a secret recovery phrase(mnemonic phrase) which can be used to recover an existing wallet account and should be kept secret.

+

Example:

+
stchaind keys add myWallet --hd-path="m/44'/606'/0'/0/0" --keyring-backend=test
+
+- name: myWallet
+type: local
+address: st1x2c6gy4vr8alsyzuqr2x8x8xxtvs97sk3jt6dp
+pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"A7HCZTlHEarBPabkOgId5SlyQKdqEsbXJHit7y9LXRy+"}'
+mnemonic: ""
+
+
+**Important** write this mnemonic phrase in a safe place.
+It is the only way to recover your account if you ever forget your password.
+
+venue chest pattern tool certain identify adult theme thing public foster promote pave topple thing uncle brisk suffer present popular envelope wrap holiday goddess
+
+


+

Recover an existing wallet🔗︎

+

If you already have a Stratos wallet account, you can recover it by typing the following command

+
stchaind keys add <your wallet name> --recover --hd-path="m/44'/606'/0'/0/0" --keyring-backend=<your chosen keyring backend>
+
+
+

Tip

+

💡 Choose a keyring-backend suited for the network you are running this chain installation on. See keyring-backend.

+

💡 Enter a wallet name that you will easily remember. This name will be used inside other commands later.

+
+

Example:

+
stchaind keys add myWallet1 --recover --hd-path="m/44'/606'/0'/0/0" --keyring-backend=test  
+
+


+

After the above keys add command executed, a keyring-* folder will be created which contains your wallets' information with their addresses.

+

The keyring-* folder looks like

+
.
+├── 32b1a412ac19fbf8105c00d46398e632d902fa16.address
+├── d0c57269c450f81234307a33bd148ac4f90549e5.address
+├── myWallet1.info
+└── myWallet.info
+
+


+

Check your wallet🔗︎

+

There are two ways to check your local wallets

+


+
    +
  • Check all local wallet accounts
  • +
+
stchaind keys list --keyring-backend=<keyring's backend> 
+
+

Example:

+
stchaind keys list --keyring-backend=test
+   - address: st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw
+     name: user0
+     pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"A/wF15Wd3ogCXstE7S4Zf3DA4KXb0W7exQhP004PLTi3"}'
+     type: local
+   - address: st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0
+     name: user1
+     pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"AgnhB5EkHL8+jD0/zRDR11nIpfOirTRrjgCX6uibhmDW"}'
+     type: local
+   - address: st1lkcrz3ktt2p7ppu9arglpqcn94pcdd9a9pmatf
+     name: user10
+     pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"A2sZ2Z9BU9oDELC06Gj8Lfc5UycxTaPux3sEIq8sIzSW"}'
+     type: local
+   - address: st16czjk2ym0prgvy4gl970t84vrp96s5kayfqmf2
+     name: user2
+     pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"AwfcJTOVWdx6ai61cy8VGJ1SdWHzwm2CCmr/+PwSpFeR"}'
+     type: local
+   - address: st17patveqxcq42rguc7nayr2g3jtawpzvhfmmumt
+     name: user3
+     pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"AtFxbuB4s+2SYzImGPIBwe0H0mKCXbIPu1T63OvbgE/3"}'
+     type: local
+
+


+
    +
  • Check a specific local wallet account
  • +
+
stchaind keys show <your wallet name> --keyring-backend=<keyring's backend> 
+
+

Example:

+
stchaind keys show myWallet1 --keyring-backend=test
+   - address: st16rzhy6wy2rupydps0gem69y2cnus2j09n42ksx
+     name: myWallet1
+     pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"A13YKi3/7p9FsFPTfVgxEO0YK8bnDHmBPfA3ID+k37ET"}'
+     type: local
+
+


+
+

Faucet🔗︎

+

Faucet will only be available on Testnet to get test tokens into your wallet.

+
curl --header "Content-Type: application/json" --request POST --data '{"denom":"stos","address":"your wallet address"} ' https://faucet-mesos.thestratos.org/credit
+
+
+

Tip

+

Replace "your wallet address" with your st1xx wallet address

+

💡1stos = 1,000,000,000gwei = 1,000,000,000,000,000,000wei

+
+


+
    +
  • Check wallet account balance
  • +
+

You can query your account info using this command:

+
stchaind query account <your wallet address>
+
+

Example:

+
stchaind query account st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx
+|
+'@type': /cosmos.auth.v1beta1.BaseAccount
+account_number: "1"
+address: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx
+pub_key: null
+sequence: "0"
+
+


+

You can query your wallet balances using this command:

+
stchaind query bank balances <your wallet address>
+
+

Example:

+
stchaind query bank balances st1d3qtsjyypa639q9kf0wmuf2dn4a7zrnujw84q4
+|
+balances:
+- amount: "9998000000000000000"
+  denom: wei
+pagination:
+next_key: null
+total: "0
+
+


+
    +
  • Try your first tx - send
  • +
+

This tx command will send an amount of tokens from one wallet address to another:

+
stchaind tx bank send <from address> <to address> <amount> --keyring-backend=<keyring's backend> --chain-id=<current chain-id> --gas=auto --gas-prices=1000000000wei
+
+
+
    +
  • For chain-id and keyring-backend, see Networks.
  • +
  • Make sure your <from address> has enough tokens
  • +
  • Please wait for around 7 seconds for block generation after a transaction.
  • +
+
+

Example:

+

Let us assume:

+
    +
  • from address: st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0
  • +
  • to address: st123wun5lnwerdrt0mk2uxtusgawpfr228a0sseg
  • +
  • amount: 10stos
  • +
+
stchaind tx bank send st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0 st123wun5lnwerdrt0mk2uxtusgawpfr228a0sseg 10stos \
+--chain-id=mesos-1  --keyring-backend=test --gas=100000 --gas-prices=1000000000wei -y
+
+code: 0
+codespace: ""
+data: ""
+events: []
+gas_used: "0"
+gas_wanted: "0"
+height: "0"
+info: ""
+logs: []
+raw_log: '[]'
+timestamp: ""
+tx: null
+txhash: BA96CF87646592487ABB9DDDE8FA86FE71441226281B04E15C5C66EDE415FBC6
+
+


+
+

Validator🔗︎

+

At this point, you have a Full-Chain Node.

+

Full-Chain nodes are also important to the network as they are able to handle queries from a client and provide scale for the validator. They are also able to mantain historical information about the state of the chain.

+

But they are not able to accept transactions from clients, validate them and insert them into the blockchain, like Validators do. So they won't be earning any rewards.

+

To convert your Full-Node to a Validator, please follow the next guide.

+

How To Become a Validator

+


+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/stchaind-commands-part-1/index.html b/docs-stratos-chain/stchaind-commands-part-1/index.html new file mode 100644 index 0000000..97a44b5 --- /dev/null +++ b/docs-stratos-chain/stchaind-commands-part-1/index.html @@ -0,0 +1,4336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Stratos Chain stchaind commands part 1 - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +

stchaind Commands Part 1

+ +

This document is the first part that describes a summarized list of stchaind commands for Stratos Chain.

+

Requirements🔗︎

+

Unlike other projects, Stratos does not require expensive GPUs and high wattage power supplies, but if the node wants to obtain revenue, it needs to provide enough bandwidth and storage capacity to ensure the traffic +on the node can reach the reward requirements.

+

We recommend the following to run your node:

+

Minimum Hardware Requirements

+ + + + + + + + + + + + + + + + + +
CPURAMStorageStake
8 Cores¹, 2.5GHz²32 GB2 TB1 STOS³
+

¹    Can be achieved using dual CPU server configurations (eg. 2cpu x 8cores, as long as the frequency per core is respected).
+²    2.5GHz refers to Base Frequency, not Turbo/Boost Frequency.
+³    Minimum stake is 1 stos until all 100 validator spots are filled. After that, is marked decided.

+

Software (tested version)

+
    +
  • Ubuntu 18.04+
  • +
  • Go 1.19+ linux/amd64
  • +
+


+
+

Connect to Stratos Chain Testnet🔗︎

+

Please refer to full-node setup guide to:

+

download related files

+

start your node to catch up to the latest block height(synchronization)

+

create your Stratos Chain Wallet

+

Faucet or send an amount of tokens to this wallet

+


+
+

Directory Structure🔗︎

+

After the node has caught up to the latest block, your Stratos-chain Wallet has been created and fed with an amount of tokens, $HOME/.stchaind directory will include the following directories and files.

+
.
+├── config
+   ├── addrbook.json
+   ├── app.toml
+   ├── client.toml
+   ├── config.toml
+   ├── genesis.json
+   ├── node_key.json
+   └── priv_validator_key.json
+├── data
+   ├── application.db
+   ├── blockstore.db
+   ├── cs.wal
+   ├── evidence.db
+   ├── priv_validator_state.json
+   ├── snapshots
+   ├── state.db
+   └── tx_index.db
+└── keyring-test
+    ├── 6894f6eef2b730a5f071eed1f3aeb471dfeeeaaf.address
+    ├── d6052b289b78468612a8f97cf59eac184ba852dd.address
+    ├── d704353fe67f948c99d2e3105adc5159c9e8f2af.address
+    ├── f07ab66406c02aa1a398f4fa41a91192fae08997.address
+    ├── fdb03146cb5a83e08785e8d1f083132d4386b4bd.address
+    ├── user0.info
+    ├── user10.info
+    ├── user1.info
+    ├── user2.info
+    └── user3.info
+
+


+

In stchaind/config folder:

+
+
    +
  • addrbook.json stores peer addresses.
  • +
  • app.toml contains the default settings required for app.
  • +
  • config.toml contains various options pertaining to the stratos-chain configurations.
  • +
  • genesis.json defines the initial state upon genesis of stratos-chain.
  • +
  • node_key.json contains the node private key and should thus be kept secret.
  • +
  • priv_validator_key.json contains the validator address, public key and private key, and should thus be kept secret.
  • +
+
+


+

In stchaind/data folder:

+
+
    +
  • All *.db folders are Tendermint databases
  • +
  • Tendermint uses a write ahead log (WAL) for consensus
  • +
  • priv_validator_state.jsonholds the validator's state
  • +
+
+


+

In stchaind/keyring-test folder:

+
+
    +
  • holds the user's information and address in the keyring-backend
  • +
+
+
+

Tip

+

By default, the binary executable stchaind has been saved or created in the $HOME folder. If you are not sure what is your $HOME folder, in terminal, use echo $HOME to check. In the following instruction, we suppose you have entered the $HOME folder(use cd $HOME)

+
+


+
+

'stchaind' Commands🔗︎

+

For ease of use, these commands have been classified by the following modules:

+ +


+
+

Global Flags🔗︎

+

Each command has its specific flags as well as several global flags. The specific flags will be explained along with each command, +while the global flags are summarized as the following that can be used for all stchaind commands.

+
Global Flags(can be used for all stchaind commands):
+  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
+      --chain-id string          Specify Chain ID for sending Tx (default "testnet")
+      --fees string              Fees to pay along with transaction; eg: 10wei
+      --from string              Name or address of private key with which to sign
+      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
+      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10wei)
+  -h, --help                     help for stchaind
+      --home string              directory for config and data (default "/home/hong/.stchaind")
+      --keyring-backend string   Select keyring's backend (default "os")
+      --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")
+      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
+      --trace                    print out full stack trace on errors
+
+
+

Tip

+
    +
  • +

    --chain-id: the current chain-id may change when updating in testing phase . When it is applied, user needs to point out current chain-id which is mesos-1 for Testnet and stratos-1 for Mainnet.

    +
  • +
  • +

    on Testnet, --keyring-backend=test

    +
  • +
  • +

    on Mainnet, --keyring-backend=os|file|pass. You must use the same one you used when creating the wallet in previous guide (Setup Full-Chain Node).

    +
  • +
  • +

    --home: this directory contains node's account information. By default, node's account info is saved or created under $HOME/.stchaind. In this case, user does not need to add --home flag in the commands. Otherwise, user has to use this flag to specify the path to the node's root directory(default '$HOME') explicitly if not using the default directory. In the following instruction, we suppose the node info has been installed or created under $HOME/.stchaind and skip the --home flag. User can add it where applicable.

    +
  • +
+
+


+
+

Denomination🔗︎

+

When executing commands that require a certain amount of tokens, you can use either denomination:

+
    +
  • 1 stos =
  • +
  • 1,000,000,000 gwei =
  • +
  • 1,000,000,000,000,000,000 wei
  • +
+

For example, the following commands will result in transfering the same value (100 stos):

+
stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100stos \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100000000000gwei \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100000000000000000000wei \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+
+

Bank Module🔗︎

+

-send🔗︎

+

Create and sign a send transaction.

+
Usage:
+  stchaind tx bank send [from_key_or_address] [to_address] [amount] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for send
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes 
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx bank send st1sqzsk8mplxx22fdgg878ccc3329gfd9g7d9g9d st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx 1stos \
+--chain-id=mesos-1  \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-balances🔗︎

+

query account bank balances.

+
Usage:
+  stchaind query bank balances [account address] [flags]
+
+Flags:
+      --count-total       count total number of records in all balances to query for
+      --denom string      The specific balance denomination to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for balances
+      --limit uint        pagination limit of all balances to query for (default 100)
+      --offset uint       pagination offset of all balances to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of all balances to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of all balances to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query bank balances st16czjk2ym0prgvy4gl970t84vrp96s5kayfqmf2
+
+


+
+

Distribution Module🔗︎

+

-withdraw-rewards🔗︎

+

Withdraw rewards from a given delegation address and optionally withdraw validator's commission if the delegation address given is a validator operator.

+
Usage:
+  stchaind tx distribution withdraw-rewards [validator-addr] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --commission            Withdraw the validator's commission in addition to the rewards
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for withdraw-rewards
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx distribution withdraw-rewards stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1  \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-withdraw-all-rewards🔗︎

+

Withdraw all delegation rewards for a delegator.

+
Usage:
+  stchaind tx distribution withdraw-all-rewards [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for withdraw-all-rewards
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --max-msgs int          Limit the number of messages per tx (0 for unlimited)
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx distribution withdraw-all-rewards \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1  \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-commission🔗︎

+

Query validator commission rewards from delegators to that validator.

+
Usage:
+  stchaind query distribution commission [validator] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for commission
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query distribution commission stvaloper1gtw399h9vfnekqsz3dg4n6mj0qgdpnh30x66xa
+
+


+

-rewards🔗︎

+

Query all rewards earned by a delegator, optionally restrict to reward from a single validator.

+
Usage:
+  stchaind query distribution rewards [delegator-addr] [validator-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for rewards
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query distribution rewards st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda --height=9765
+
+


+

-outstanding-rewards🔗︎

+

Query distribution outstanding (un-withdrawn) rewards for a validator and all their delegations.

+
Usage:
+  stchaind query distribution validator-outstanding-rewards [validator] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for validator-outstanding-rewards
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query distribution validator-outstanding-rewards stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k
+
+


+

-community-pool🔗︎

+

Query all coins in the community pool which is under Governance control.

+
Usage:
+  stchaind query distribution community-pool [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for community-pool
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query distribution community-pool --height=9765
+
+


+

-slashes🔗︎

+

Query all slashes of a validator for a given block range.

+
Usage:
+  stchaind query distribution slashes [validator] [start-height] [end-height] [flags]
+
+Flags:
+      --count-total       count total number of records in validator slashes to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for slashes
+      --limit uint        pagination limit of validator slashes to query for (default 100)
+      --offset uint       pagination offset of validator slashes to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of validator slashes to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of validator slashes to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query distribution slashes stvaloper1095s2f3m60qz48spy3wr52gw8xmy7xqywnxnrq 0 500
+
+


+

-distribution-params🔗︎

+

Query distribution params.

+
Usage:
+  stchaind query distribution params [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for params
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query distribution params
+
+


+
+

Gov Module🔗︎

+

-submit-proposal🔗︎

+

Submit a proposal along with an initial deposit. Proposal title, description, type and deposit can be given directly or through a proposal JSON file.

+

Except for itself, the command submit-proposal also provides three sub-commands, param-change, +community-pool-spend and software-upgrade, to submit a proposal for changing global parameters, +distributing funds in community-pool and upgrading software.

+
Usage:
+  stchaind tx gov submit-proposal [flags]
+  stchaind tx gov submit-proposal [command]
+
+Available Commands:
+  cancel-software-upgrade Cancel the current software upgrade proposal
+  community-pool-spend    Submit a community pool spend proposal
+  param-change            Submit a parameter change proposal
+  software-upgrade        Submit a software upgrade proposal
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --deposit string        The proposal deposit
+      --description string    The proposal description
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for submit-proposal
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+      --proposal string       Proposal file path (if this path is given, other proposal flags are ignored)
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+      --title string          The proposal title
+      --type string           The proposal Type
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+
+  In testing phase, --keyring-backend="test"
+
+


+
    +
  • submit-proposal example:
  • +
+
Usage:
+stchaind tx gov submit-proposal <proposal.json> --from=<Name|address of private key>
+
+

Where proposal.json contains:

+
    {
+      "title": "Test Proposal",
+      "description": "My awesome proposal",
+      "type": "Text",
+      "deposit": "100000000000gwei"
+    }
+
+

Which is equivalent to:

+
stchaind tx gov submit-proposal \
+--title="Test Proposal" \
+--description="My awesome proposal" \
+--type="Text" \
+--deposit="100000000000gwei" \
+--from=<name|address of private key>
+
+

submit-proposal Tx command:

+
stchaind tx gov submit-proposal \
+--title="Test Proposal" \
+--description="My awesome proposal" \
+--type="Text" \
+--deposit="100000000000gwei" \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1  \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+
    +
  • param-change example:
  • +
+

Submit a parameter proposal along with an initial deposit. The proposal details must be supplied via a JSON file. +For values that contains objects, only non-empty fields will be updated.

+
Usage:
+stchaind tx gov submit-proposal param-change [proposal-file] [flags]
+
+

param-change example tx command:

+
stchaind tx gov submit-proposal param-change <proposal-file> \
+--from=<name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend'> \
+--gas=auto --gas-prices=1000000000wei
+
+

A sample of param_change.json could be:

+
{
+    "title": "Param-Change",
+    "description": "This is a test to update deposit params in gov Module",
+    "changes": [
+        {
+            "subspace": "gov",
+            "key": "depositparams",
+            "value": {"max_deposit_period":"72800000000000"}
+        }
+    ],
+    "deposit": "1000000000000gwei"
+}
+
+

param-change tx command:

+
stchaind tx gov submit-proposal param-change ./helpers/param_change.json \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+
    +
  • community-pool-spend example:
  • +
+

Submit a community pool spend proposal along with an initial deposit. The proposal details must be supplied via a JSON file.

+
Usage:
+stchaind tx gov submit-proposal community-pool-spend [proposal-file] [flags]
+
+

The proposal.json could be: +

    {
+      "title": "Community Pool Spend",
+      "description": "Pay me some STOSes!",
+      "recipient": "st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda",
+      "amount": [
+        {
+          "denom": "wei",
+          "amount": "1000000000000"
+        }
+      ],
+      "deposit": [
+        {
+          "denom": "gwei",
+          "amount": "1000000000000"
+        }
+      ]
+    }
+

+

community-pool-spend tx command:

+
stchaind tx gov submit-proposal community-pool-spend ./helpers/proposal.json \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+
    +
  • software-upgrade example:
  • +
+

Submit a software upgrade along with an initial deposit.

+
Usage:
+  stchaind tx gov submit-proposal software-upgrade [name] (--upgrade-height [height]) (--upgrade-info [info]) [flags]
+
+

software-upgrade tx command:

+
stchaind tx gov submit-proposal software-upgrade="v0.3.1" \
+--upgrade-height=1000 \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--description=test1 \
+--title=test1 \
+--deposit=100000000000gwei \
+--info=testinfo \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-deposit🔗︎

+

Deposit tokens for an active proposal by proposal-id which can be found with the command stchaind query gov proposals.

+
Usage:
+  stchaind tx gov deposit [proposal-id] [deposit] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for deposit
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx gov deposit 7 100000000gwei \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-vote (transaction)🔗︎

+

Submit a vote for an active proposal. Vote options include yes/no/no_with_veto/abstain.

+
Usage:
+  stchaind tx gov vote [proposal-id] [option] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for vote
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+    In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx gov vote 7 yes \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-proposal🔗︎

+

Query details for a proposal. You can find the proposal-id by running stchaind query gov proposals

+
Usage:
+  stchaind query gov proposal [proposal-id] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for proposal
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query gov proposal 7
+
+

Result:

+
content:
+  title: Param-Change Staking MaxValidators to 100
+  description: This is a test to update MaxValidators to 100 in staking Module
+  changes:
+  - subspace: staking
+    key: MaxValidators
+    value: "100"
+id: 7
+proposal_status: 3
+final_tally_result:
+  "yes": "400000000"
+  abstain: "0"
+  "no": "0"
+  no_with_veto: "0"
+submit_time: 2021-07-23T14:40:04.976927421Z
+deposit_end_time: 2021-07-23T14:41:44.976927421Z
+total_deposit:
+- denom: wei
+  amount: "100010000000000000000"
+voting_start_time: 2021-07-23T14:40:41.961523583Z
+voting_end_time: 2021-07-23T14:42:21.961523583Z
+
+


+

-proposals🔗︎

+

Query details of all proposals with optional filters(flags).

+
Usage:
+  stchaind query gov proposals [flags]
+
+Flags:
+      --count-total        count total number of records in proposals to query for
+      --depositor string   (optional) filter by proposals deposited on by depositor
+      --height int         Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help               help for proposals
+      --limit uint         pagination limit of proposals to query for (default 100)
+      --offset uint        pagination offset of proposals to query for
+  -o, --output string      Output format (text|json) (default "text")
+      --page uint          pagination page of proposals to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string    pagination page-key of proposals to query for
+      --reverse            results are sorted in descending order
+      --status string      (optional) filter proposals by proposal status, status: deposit_period/voting_period/passed/rejected
+      --voter string       (optional) filter by proposals voted on by voted
+
+    stchaind query gov proposals --depositor st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+    stchaind query gov proposals --voter st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+    stchaind query gov proposals --status (DepositPeriod|VotingPeriod|Passed|Rejected)
+    stchaind query gov proposals --page=2 --limit=100
+
+

Example:

+
stchaind query gov proposals
+
+

Result:

+
- content:
+    title: Param-Change Staking MaxValidators to 5
+    description: This is a test to update MaxValidators to 5 in staking Module
+    changes:
+    - subspace: staking
+      key: MaxValidators
+      value: "5"
+  id: 1
+  proposal_status: 3
+  final_tally_result:
+    "yes": "383333332"
+    abstain: "0"
+    "no": "0"
+    no_with_veto: "0"
+  submit_time: 2021-07-19T15:38:08.619640056Z
+  deposit_end_time: 2021-07-19T15:39:48.619640056Z
+  total_deposit:
+  - denom: wei
+    amount: "100010000000000000000"
+  voting_start_time: 2021-07-19T15:38:23.789218262Z
+  voting_end_time: 2021-07-19T15:40:03.789218262Z
+
+...
+
+- content:
+    title: Param-Change Staking MaxValidators to 100
+    description: This is a test to update MaxValidators to 100 in staking Module
+    changes:
+    - subspace: staking
+      key: MaxValidators
+      value: "100"
+  id: 7
+  proposal_status: 3
+  final_tally_result:
+    "yes": "400000000"
+    abstain: "0"
+    "no": "0"
+    no_with_veto: "0"
+  submit_time: 2021-07-23T14:40:04.976927421Z
+  deposit_end_time: 2021-07-23T14:41:44.976927421Z
+  total_deposit:
+  - denom: wei
+    amount: "100010000000000000000"
+  voting_start_time: 2021-07-23T14:40:41.961523583Z
+  voting_end_time: 2021-07-23T14:42:21.961523583Z
+
+


+

-vote (query)🔗︎

+

Query details for a single vote on a proposal given its identifier.

+
Usage:
+  stchaind query gov vote [proposal-id] [voter-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for vote
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query gov vote 7 st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+
+

Result:

+
proposal_id: 7
+voter: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+option: 1
+
+


+

-votes🔗︎

+

Query vote details for a single proposal by its identifier.

+
Usage:
+  stchaind query gov votes [proposal-id] [flags]
+
+Flags:
+      --count-total       count total number of records in votes to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for votes
+      --limit uint        pagination limit of votes to query for (default 100)
+      --offset uint       pagination offset of votes to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of votes to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of votes to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query gov votes 7
+
+

Result:

+
- proposal_id: 7
+  voter: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+  option: 1
+- proposal_id: 7
+  voter: st1m4f4hnyfhpaeqlcgv7lfhgzjwmrvfeggwnpygz
+  option: 1
+- proposal_id: 7
+  voter: st1kuhyf59qvukk8r5manky062d6c66utvytm7az6
+  option: 1
+- proposal_id: 7
+  voter: st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k
+  option: 1
+
+


+

-deposit🔗︎

+

Query details for a single proposal deposit on a proposal by its identifier.

+
Usage:
+  stchaind query gov deposit [proposal-id] [depositer-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for deposit
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query gov deposit 7 st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+
+

Result:

+
proposal_id: 7
+depositor: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+amount:
+- denom: wei
+  amount: "100000000"
+
+


+

-deposits🔗︎

+

Query details for all deposits on a proposal.

+
Usage:
+  stchaind query gov deposits [proposal-id] [flags]
+
+Flags:
+      --count-total       count total number of records in deposits to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for deposits
+      --limit uint        pagination limit of deposits to query for (default 100)
+      --offset uint       pagination offset of deposits to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of deposits to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of deposits to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query gov deposits 7
+
+

Result:

+
- proposal_id: 7
+  depositor: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+  amount:
+  - denom: wei
+    amount: "100000000"
+
+


+
+

Slashing Module🔗︎

+

-unjail🔗︎

+

Unjail a jailed validator.

+
Usage:
+  stchaind tx slashing unjail [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for unjail
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx slashing unjail \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-signing-info🔗︎

+

Use a validators' consensus public key to find the signing-info for that validator.

+
Usage:
+  stchaind query slashing signing-info [validator-conspub] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for signing-info
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query slashing signing-info stvalconspub1zcjduepqsnwlx7rv0ghyvh9tm99zle39df99jt8hccwt8jdrvjs26zqrzh9shdmgyc
+
+

Result:

+
address: stvalcons1sa58sznp26ftquypx994q2eurq6qy38tfm3rn3
+start_height: 0
+index_offset: 3874
+jailed_until: 1970-01-01T00:00:00Z
+tombstoned: false
+missed_blocks_counter: 0
+
+


+

-slashing-params🔗︎

+

Query genesis parameters for the slashing module.

+
Usage:
+  stchaind query slashing params [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for params
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query slashing params
+
+

Result:

+
signed_blocks_window: 10000
+min_signed_per_window: "0.500000000000000000"
+downtime_jail_duration: 10m0s
+slash_fraction_double_sign: "0.050000000000000000"
+slash_fraction_downtime: "0.010000000000000000"
+
+


+
+

Staking Module🔗︎

+

-delegate🔗︎

+

Delegate an amount of liquid coins to a validator from your wallet.

+
Usage:
+  stchaind tx staking delegate [validator-addr] [amount] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for delegate
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 1000gwei \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-redelegate🔗︎

+

Redelegate an amount of illiquid staking tokens from one validator to another.

+
Usage:
+  stchaind tx staking redelegate [src-validator-addr] [dst-validator-addr] [amount] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for redelegate
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx staking redelegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k stvaloper1gtw399h9vfnekqsz3dg4n6mj0qgdpnh30x66xa 1000gwei \
+--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-unbond🔗︎

+

Unbond an amount of bonded shares from a validator.

+
Usage:
+  stchaind tx staking unbond [validator-addr] [amount] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for unbond
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
stchaind tx staking unbond stvaloper12adksjsd7gcsn23h5jmvdygzx2lfw5q4pyf57u 10000gwei \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-create-validator🔗︎

+

Create new validator initialized with a self-delegation to it.

+
Usage:
+  stchaind tx staking create-validator [flags]
+
+Flags:
+  -a, --account-number uint                 The account number of the signing account (offline mode only)
+      --amount string                       Amount of coins to bond
+      --commission-max-change-rate string   The maximum commission change rate percentage (per day)
+      --commission-max-rate string          The maximum commission rate percentage
+      --commission-rate string              The initial commission rate percentage
+      --details string                      The validator's (optional) details
+      --dry-run                             ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string                  Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                          gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only                       Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                                help for create-validator
+      --identity string                     The optional identity signature (ex. UPort or Keybase)
+      --ip string                           The node's public IP. It takes effect only when used in combination with --generate-only
+      --keyring-dir string                  The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                              Use a connected Ledger device
+      --min-self-delegation string          The minimum self delegation required on the validator
+      --moniker string                      The validator's name
+      --node-id string                      The node's ID
+      --note string                         Note to add a description to the transaction (previously --memo)
+      --offline                             Offline mode (does not allow any online functionality
+  -o, --output string                       Output format (text|json) (default "json")
+      --pubkey string                       The validator's Protobuf JSON encoded public key
+      --security-contact string             The validator's (optional) security contact email
+  -s, --sequence uint                       The sequence number of the signing account (offline mode only)
+      --sign-mode string                    Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint                 Set a block timeout height to prevent the tx from being committed past a certain height
+      --website string                      The validator's (optional) website
+  -y, --yes                                 Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+
+

Tip

+
    +
  • moniker: the validator's name
  • +
  • pubkey: the private key associated with this Tendermint PubKey is used to sign prevotes and precommits
  • +
  • website: website(Optional)
  • +
  • description: description(Optional)
  • +
  • commission-rate: the commission rate on block rewards and fees charged to delegators
  • +
  • commission-max-rate: the maximum commission rate which this validator can charge. This parameter cannot be changed after create-validator is processed.
  • +
  • commission-max-change-rate: the maximum daily increase of the validator commission. This parameter cannot be changed after create-validator is processed.
  • +
  • min-self-delegation: minimum amount of tokens the validator needs to have bonded at all time. If the validator's self-delegated stake falls below this limit, their entire staking pool will unbond.
  • +
  • amount: the amount of tokens to be bonded to the validator at creation. This value should be greater than the value of min-self-delegation
  • +
+
+

Example:

+
stchaind tx staking create-validator \
+--amount=100stos \
+--pubkey='{"@type":"/cosmos.crypto.ed25519.PubKey","key":"JwtmYzaX0b+zjuDypUI2+qy8wa/LFtUUUg0+vr11tpg="}' \
+--moniker="myValidator" \
+--commission-rate=0.10 \
+--commission-max-rate=0.20 \
+--commission-max-change-rate=0.01 \
+--min-self-delegation=1 \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--chain-id=mesos-1 --keyring-backend=test --gas=auto --gas-prices=1000000000wei -y 
+
+

The value of --pubkey can be retrieved by using the command stchaind tendermint show-validator

+


+

-edit-validator🔗︎

+

Edit an existing validator account.

+
Usage:
+  stchaind tx staking edit-validator [flags]
+
+Flags:
+  -a, --account-number uint          The account number of the signing account (offline mode only)
+      --commission-rate string       The new commission rate percentage
+      --details string               The validator's (optional) details (default "[do-not-modify]")
+      --dry-run                      ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string           Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                   gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only                Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                         help for edit-validator
+      --identity string              The (optional) identity signature (ex. UPort or Keybase) (default "[do-not-modify]")
+      --keyring-dir string           The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                       Use a connected Ledger device
+      --min-self-delegation string   The minimum self delegation required on the validator
+      --moniker string               The validator's name (default "[do-not-modify]")
+      --note string                  Note to add a description to the transaction (previously --memo)
+      --offline                      Offline mode (does not allow any online functionality
+  -o, --output string                Output format (text|json) (default "json")
+      --security-contact string      The validator's (optional) security contact email (default "[do-not-modify]")
+  -s, --sequence uint                The sequence number of the signing account (offline mode only)
+      --sign-mode string             Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint          Set a block timeout height to prevent the tx from being committed past a certain height
+      --website string               The validator's (optional) website (default "[do-not-modify]")
+  -y, --yes                          Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+
+

Tip

+
    +
  • min_self_delegation allows to increase only
  • +
  • commission-max-rate cannot be changed after create-validator
  • +
  • commission-max-change-ratecannot be changed after create-validator
  • +
+
+

Example:

+
stchaind tx staking edit-validator \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--keyring-backend=test \
+--min-self-delegation=100  \
+--memo="Change 'min-self-delegation' from 1 to 100" \
+--chain-id=mesos-1  --keyring-backend=test --gas=auto --gas-prices=1000000000wei -y
+
+


+

-delegation🔗︎

+

Query a delegation based on delegator address and validator address.

+
Usage:
+  stchaind query staking delegation [delegator-addr] [validator-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for delegation
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query staking delegation st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k
+
+

Result:

+
delegation:
+  delegator_address: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda
+  validator_address: stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k
+  shares: "100000000000000000000.000000000000000000"
+balance:
+  denom: wei
+  amount: "1000000000000000000000"
+
+


+

-delegations🔗︎

+

Query delegations for an individual delegator on all validators.

+
Usage:
+  stchaind query staking delegations [delegator-addr] [flags]
+
+Flags:
+      --count-total       count total number of records in delegations to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for delegations
+      --limit uint        pagination limit of delegations to query for (default 100)
+      --offset uint       pagination offset of delegations to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of delegations to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of delegations to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query staking delegations st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+
+

Result:

+
delegation_responses:
+- balance:
+    amount: "500000000000"
+    denom: wei
+  delegation:
+    delegator_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+    shares: "500000000000.000000000000000000"
+    validator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+pagination:
+  next_key: null
+  total: "0"
+
+


+

-delegations-to🔗︎

+

Query all delegations made to one validator.

+
Usage:
+  stchaind query staking delegations-to [validator-addr] [flags]
+
+Flags:
+      --count-total       count total number of records in validator delegations to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for delegations-to
+      --limit uint        pagination limit of validator delegations to query for (default 100)
+      --offset uint       pagination offset of validator delegations to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of validator delegations to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of validator delegations to query for
+      --reverse           results are sorted in descending ord
+
+

Example:

+
stchaind query staking delegations-to stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+
+

Result:

+
delegation_responses:
+- balance:
+    amount: "500000000000"
+    denom: wei
+  delegation:
+    delegator_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+    shares: "500000000000.000000000000000000"
+    validator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+pagination:
+  next_key: null
+  total: "0"
+
+


+

-unbonding-delegations🔗︎

+

Query unbonding delegations for an individual delegator.

+
Usage:
+  stchaind query staking unbonding-delegations [delegator-addr] [flags]
+
+Flags:
+      --count-total       count total number of records in unbonding delegations to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for unbonding-delegations
+      --limit uint        pagination limit of unbonding delegations to query for (default 100)
+      --offset uint       pagination offset of unbonding delegations to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of unbonding delegations to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of unbonding delegations to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind q staking unbonding-delegations st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2
+
+

Result:

+
- delegator_address: st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2
+  validator_address: stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p
+  entries:
+  - creation_height: 5805
+    completion_time: 2021-08-30T19:53:31.144199109Z
+    initial_balance: "10000"
+    balance: "10000"
+
+


+

-unbonding-delegation🔗︎

+

Query unbonding delegations for an individual delegator on an individual validator.

+
Usage:
+  stchaind query staking unbonding-delegation [delegator-addr] [validator-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for unbonding-delegation
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example

+
stchaind q staking unbonding-delegation st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2 stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p
+
+


+

-unbonding-delegations-from🔗︎

+

Query all unbonding delegatations from a validator.

+
Usage:
+  stchaind query staking unbonding-delegations-from [validator-addr] [flags]
+
+Flags:
+      --count-total       count total number of records in unbonding delegations to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for unbonding-delegations-from
+      --limit uint        pagination limit of unbonding delegations to query for (default 100)
+      --offset uint       pagination offset of unbonding delegations to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of unbonding delegations to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of unbonding delegations to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query staking unbonding-delegations-from stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p
+
+

Result:

+
- delegator_address: st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2
+  validator_address: stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p
+  entries:
+  - creation_height: 5805
+    completion_time: 2021-08-30T19:53:31.144199109Z
+    initial_balance: "10000"
+    balance: "10000"
+
+


+

-redelegation🔗︎

+

Query a redelegation record based on delegator and a source and destination validator address.

+
Usage:
+  stchaind query staking redelegation [delegator-addr] [src-validator-addr] [dst-validator-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for redelegation
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query staking redelegation st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76 stvaloper1gamc7ajhzukp08nle9z9asyfx4u4dlz53dquzj stvaloper1zgqhnz69jppcwg9z27vtq3zq9r3du5v6vjqvpq
+
+

Result:

+
- redelegation:
+    delegator_address: st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76
+    validator_src_address: stvaloper1gamc7ajhzukp08nle9z9asyfx4u4dlz53dquzj
+    validator_dst_address: stvaloper1zgqhnz69jppcwg9z27vtq3zq9r3du5v6vjqvpq
+    entries: []
+  entries:
+  - redelegationentry:
+      creation_height: 1909
+      completion_time: 2021-09-02T19:33:26.890343914Z
+      initial_balance: "10000"
+      shares_dst: "10000.000000000000000000"
+    balance: "10000"
+
+


+

-redelegations🔗︎

+

Query all redelegations records for one delegator.

+
Usage:
+  stchaind query staking redelegations [delegator-addr] [flags]
+
+Flags:
+      --count-total       count total number of records in delegator redelegations to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for redelegations
+      --limit uint        pagination limit of delegator redelegations to query for (default 100)
+      --offset uint       pagination offset of delegator redelegations to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of delegator redelegations to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of delegator redelegations to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query staking redelegations st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76
+
+

Result:

+
- redelegation:
+    delegator_address: st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76
+    validator_src_address: stvaloper1gamc7ajhzukp08nle9z9asyfx4u4dlz53dquzj
+    validator_dst_address: stvaloper1zgqhnz69jppcwg9z27vtq3zq9r3du5v6vjqvpq
+    entries: []
+  entries:
+  - redelegationentry:
+      creation_height: 1909
+      completion_time: 2021-09-02T19:33:26.890343914Z
+      initial_balance: "10000"
+      shares_dst: "10000.000000000000000000"
+    balance: "10000"
+
+


+

-redelegations-from🔗︎

+

Query all unbonding delegatations from a validator.

+
Usage:
+  stchaind query staking unbonding-delegations-from [validator-addr] [flags]
+
+Flags:
+      --count-total       count total number of records in unbonding delegations to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for unbonding-delegations-from
+      --limit uint        pagination limit of unbonding delegations to query for (default 100)
+      --offset uint       pagination offset of unbonding delegations to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of unbonding delegations to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of unbonding delegations to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query staking unbonding-delegations-from stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p
+
+

Result:

+
- delegator_address: st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2
+  validator_address: stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p
+  entries:
+  - creation_height: 5805
+    completion_time: 2021-08-30T19:53:31.144199109Z
+    initial_balance: "10000"
+    balance: "10000"
+
+


+

-historical-info🔗︎

+

Query historical info at given height.

+
Usage:
+  stchaind query staking historical-info [height] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for historical-info
+  -o, --output string   Output format (text|json) (default "text")
+
+
Note:
+The response of `historical-info` is depended on the `skating` parameter `HistoricalEntries`. 
+If `HistoricalEntries` is "0", the response will always be
+
+ERROR: no historical info found
+
+

Example:

+
stchaind query staking historical-info 300
+
+

Result:

+
header:
+  app_hash: fun5OdjHvsMZU1g+mcpgnfDuVBDSTTQjrTjJ3jvEkpo=
+  chain_id: test-chain
+  consensus_hash: BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=
+  data_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
+  evidence_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
+  height: "300"
+  last_block_id:
+    hash: heoL6s+ZfzE4xdhvUuKe5OKppwYIklXVvV+hDQe17G0=
+    part_set_header:
+      hash: wHoreN7ckwhF3a4dTDRKi47wvrIq0gme2AgNXBf/E3U=
+      total: 1
+  last_commit_hash: sk5idFtJj7qZFHyVbQ/PsB/TQfovdKn2SEekPWF7ZJc=
+  last_results_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
+  next_validators_hash: UjS9kaOnUeBVw1h2V43kpGYxGoDVQLWYha9o721NVt4=
+  proposer_address: GKcWnBtCfZlBM/ez1FBOknids3w=
+  time: "2023-01-11T00:51:55.887814534Z"
+  validators_hash: UjS9kaOnUeBVw1h2V43kpGYxGoDVQLWYha9o721NVt4=
+  version:
+    app: "0"
+    block: "11"
+valset:
+- commission:
+    commission_rates:
+      max_change_rate: "0.010000000000000000"
+      max_rate: "0.200000000000000000"
+      rate: "0.100000000000000000"
+    update_time: "2023-01-09T17:08:58.489050300Z"
+  consensus_pubkey:
+    '@type': /cosmos.crypto.ed25519.PubKey
+    key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=
+  delegator_shares: "500000000000.000000000000000000"
+  description:
+    details: ""
+    identity: ""
+    moniker: node
+    security_contact: ""
+    website: ""
+  jailed: false
+  min_self_delegation: "1"
+  operator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+  status: BOND_STATUS_BONDED
+  tokens: "500000000000"
+  unbonding_height: "0"
+  unbonding_time: "1970-01-01T00:00:00Z"
+
+


+

-pool🔗︎

+

Query values for amounts stored in the staking pool.

+
Usage:
+  stchaind query staking pool [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for pool
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query staking pool
+
+

Result:

+
bonded_tokens: "500000000000"
+not_bonded_tokens: "0"
+
+


+

-staking-params🔗︎

+

Query values set as staking parameters.

+
Usage:
+  stchaind query staking params [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for params
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query staking params
+
+

Result:

+
bond_denom: wei
+historical_entries: 10000
+max_entries: 7
+max_validators: 100
+unbonding_time: 1814400s
+
+


+

-validator🔗︎

+

Query details about an individual validator

+
Usage:
+  stchaind query staking validator [validator-addr] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for validator
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query staking validator stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+
+

Result:

+
- |
+commission:
+  commission_rates:
+    max_change_rate: "0.010000000000000000"
+    max_rate: "0.200000000000000000"
+    rate: "0.100000000000000000"
+  update_time: "2023-01-09T17:08:58.489050300Z"
+consensus_pubkey:
+  '@type': /cosmos.crypto.ed25519.PubKey
+  key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=
+delegator_shares: "500000000000.000000000000000000"
+description:
+  details: ""
+  identity: ""
+  moniker: node
+  security_contact: ""
+  website: ""
+jailed: false
+min_self_delegation: "1"
+operator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+status: BOND_STATUS_BONDED
+tokens: "500000000000"
+unbonding_height: "0"
+unbonding_time: "1970-01-01T00:00:00Z"
+
+


+

-validators🔗︎

+

Query values for amounts stored in the staking pool.

+
Usage:
+  stchaind query staking validators [flags]
+
+Flags:
+      --count-total       count total number of records in validators to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for validators
+      --limit uint        pagination limit of validators to query for (default 100)
+      --offset uint       pagination offset of validators to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of validators to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of validators to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
stchaind query staking validators
+
+

Result:

+
- |
+pagination:
+  next_key: null
+  total: "0"
+validators:
+- commission:
+    commission_rates:
+      max_change_rate: "0.010000000000000000"
+      max_rate: "0.200000000000000000"
+      rate: "0.100000000000000000"
+    update_time: "2023-01-09T17:08:58.489050300Z"
+  consensus_pubkey:
+    '@type': /cosmos.crypto.ed25519.PubKey
+    key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=
+  delegator_shares: "500000000000.000000000000000000"
+  description:
+    details: ""
+    identity: ""
+    moniker: node
+    security_contact: ""
+    website: ""
+  jailed: false
+  min_self_delegation: "1"
+  operator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+  status: BOND_STATUS_BONDED
+  tokens: "500000000000"
+  unbonding_height: "0"
+  unbonding_time: "1970-01-01T00:00:00Z"
+
+


+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/stchaind-commands-part-2/index.html b/docs-stratos-chain/stchaind-commands-part-2/index.html new file mode 100644 index 0000000..e425c03 --- /dev/null +++ b/docs-stratos-chain/stchaind-commands-part-2/index.html @@ -0,0 +1,4734 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Stratos Chain stchaind commands part 2 - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +

stchaind Commands Part 2

+ +

This document is the second part of stchaind commands for Stratos Chain.

+ +


+
+

Register Module🔗︎

+

-create-resource-node🔗︎

+

Create a new resource node

+
Usage:
+  stchaind tx register create-resource-node [flags]
+
+Flags:
+  -a, --account-number uint       The account number of the signing account (offline mode only)
+      --amount string             Amount of coins to bond
+      --details string            The node's (optional) details
+      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                      help for create-resource-node
+      --identity string           The (optional) identity signature (ex. UPort or Keybase)
+      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                    Use a connected Ledger device
+      --moniker string            The node's name
+      --network-address string    The address of the PP node
+      --node-type uint32          The value of node_type is determined by the three node types (storage=4/database=2/computation=1) and their arbitrary combinations.
+      --note string               Note to add a description to the transaction (previously --memo)
+      --offline                   Offline mode (does not allow any online functionality
+  -o, --output string             Output format (text|json) (default "json")
+      --pubkey string             The resource node's Protobuf JSON encoded public key
+      --security-contact string   The node's (optional) security contact email
+  -s, --sequence uint             The sequence number of the signing account (offline mode only)
+      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height
+      --website string            The node's (optional) website
+  -y, --yes                       Skip tx broadcasting prompt confirmation
+
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register create-resource-node \
+--network-address=<network-address> \
+--amount=<amount> \
+--pubkey=<pubkey of resource node> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--moniker=<name of resource node> \
+--node-type=<resource node type, int 1~7>
+
+

Transaction example:

+
 stchaind tx register create-resource-node \
+ --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \
+ --amount=10stos \
+ --pubkey=stsdspub1zcjduepqmrsput8d8c4tqeztrwzjjntg0jdgvmuyd5pur2g0chpxv5cccdsq4drddm \
+ --from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+ --moniker=resource-node0 \
+ --node-type=1 \
+ --chain-id=mesos-1 \
+ --keyring-backend=test \
+ --gas=auto \
+ --gas-prices=1000000000wei -y
+
+

There are three ways to check if the new resource node is in the resource-node list:

+
    +
  • Client Command
  • +
  • REST API
  • +
  • GRPC Command
  • +
+

Client Command:

+
stchaind query register get-resource-node --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+
+

Response: +

creation_time: "2023-01-10T16:48:24.591781632Z"
+description:
+  details: ""
+  identity: ""
+  moniker: resource-node0
+  security_contact: ""
+  website: ""
+network_address: stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+node_type: 1
+owner_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+pubkey:
+  '@type': /cosmos.crypto.ed25519.PubKey
+  key: 2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=
+status: BOND_STATUS_BONDED
+suspend: true
+tokens: "10000000000000000000"
+

+

REST API:

+
http://127.0.0.1:1317/register/deposit/address/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+
+

Response:

+
{
+  "height": "7",
+  "result": {
+    "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+    "pubkey": {
+      "type": "tendermint/PubKeyEd25519",
+      "value": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+    },
+    "suspend": true,
+    "status": 3,
+    "tokens": "10000000000000000000",
+    "owner_address": "st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh",
+    "description": {
+      "moniker": "resource-node0",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "2023-01-10T16:48:24.591781632Z",
+    "node_type": 1,
+    "bonded_deposit": {
+      "denom": "wei",
+      "amount": "10000000000000000000"
+    },
+    "un_bonding_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    },
+    "un_bonded_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    }
+  }
+}
+
+

GRPC Command:

+
grpcurl -plaintext -d '{"network_addr":"stsds1m9fhlyy2eug7kcgrqfdxxxvnscp5qdvut6g4xz","query_type":"0" }' 127.0.0.1:9090 stratos.register.v1.Query.DepositByNode
+
+

Note:

+
query_type     = 0   query the deposit info of both resource nodes or meta and nodes with this account address
+query_type     = 1   query the deposit info of only meta node with this account address
+query_type     = 2   query the deposit info of only resource node with this account address
+
+

Response:

+
{
+  "deposit_info": {
+    "network_address": "stsds1m9fhlyy2eug7kcgrqfdxxxvnscp5qdvut6g4xz",
+    "pubkey": {
+      "type_url": "/cosmos.crypto.ed25519.PubKey",
+      "value": "CiD37kGSAjc+jRvAqaphnkKNarZo6KePzYmp1ViQxMHVvg=="
+    },
+    "suspend": true,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "2003000000000000000000",
+    "owner_address": "st18986jyng5vsprmtzkdxla80jrw7qyc6wl73h0u",
+    "description": {
+      "moniker": "stsds1m9fhlyy2eug7kcgrqfdxxxvnscp5qdvut6g4xz",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": {
+      "seconds": "1685729968",
+      "nanos": 908306425
+    },
+    "node_type": 4,
+    "bonded_deposit": {
+      "denom": "wei",
+      "amount": "2003000000000000000000"
+    },
+    "un_bonding_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    },
+    "un_bonded_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    }
+  }
+}
+
+


+

-update-resource-node🔗︎

+

Update a resource node info

+
Usage:
+  stchaind tx register update-resource-node [flags]
+
+Flags:
+  -a, --account-number uint       The account number of the signing account (offline mode only)
+      --details string            The node's (optional) details
+      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                      help for update-resource-node
+      --identity string           The (optional) identity signature (ex. UPort or Keybase)
+      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                    Use a connected Ledger device
+      --moniker string            The node's name
+      --network-address string    The address of the PP node
+      --node-type uint32          The value of node_type is determined by the three node types (storage=4/database=2/computation=1) and their arbitrary combinations.
+      --note string               Note to add a description to the transaction (previously --memo)
+      --offline                   Offline mode (does not allow any online functionality
+  -o, --output string             Output format (text|json) (default "json")
+      --security-contact string   The node's (optional) security contact email
+  -s, --sequence uint             The sequence number of the signing account (offline mode only)
+      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height
+      --website string            The node's (optional) website
+  -y, --yes                       Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register update-resource-node \
+--network-address=<resourceNode_address> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--moniker=<name of resource node> \
+--node-type=<resource node type, int 1~7>
+
+

Transaction example:

+
stchaind tx register update-resource-node \
+--network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--moniker=resource-nodeupdate \
+--node-type=7 \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+

Check if the new resource node info has been updated.

+
stchaind query register get-resource-node --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+
+

Response:

+
creation_time: "2023-01-10T18:16:14.738068297Z"
+description:
+  details: ""
+  identity: ""
+  moniker: resource-nodeupdate
+  security_contact: ""
+  website: ""
+network_address: stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+node_type: 7
+owner_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+pubkey:
+  '@type': /cosmos.crypto.ed25519.PubKey
+  key: 2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=
+status: BOND_STATUS_BONDED
+suspend: true
+tokens: "10000000000000000000"
+
+


+

-update-resource-node-deposit🔗︎

+

update resource node's deposit

+
Usage:
+  stchaind tx register update-resource-node-deposit [flags]
+
+Flags:
+  -a, --account-number uint      The account number of the signing account (offline mode only)
+      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string       Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string               gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                     help for update-resource-node-deposit
+      --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                   Use a connected Ledger device
+      --network-address string   The address of the PP node
+      --note string              Note to add a description to the transaction (previously --memo)
+      --offline                  Offline mode (does not allow any online functionality
+  -o, --output string            Output format (text|json) (default "json")
+  -s, --sequence uint            The sequence number of the signing account (offline mode only)
+      --sign-mode string         Choose sign mode (direct|amino-json), this is an advanced feature
+      --deposit-delta string     Deposit change of coins to be made (always positive like 100000gwei)
+      --timeout-height uint      Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                      Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register update-resource-node-deposit \
+--network-address=<resource_node_address> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--deposit-delta=<delta_amount> \
+--gas=auto
+
+

Transaction example:

+
stchaind tx register update-resource-node \
+--network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--moniker=resource-nodeupdate \
+--node-type=7 --chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-remove-resource-node🔗︎

+

remove a resource node

+
Usage:
+  stchaind tx register remove-resource-node [flag] [flags]
+
+Flags:
+  -a, --account-number uint      The account number of the signing account (offline mode only)
+      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string       Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string               gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                     help for remove-resource-node
+      --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                   Use a connected Ledger device
+      --network-address string   The address of the PP node
+      --note string              Note to add a description to the transaction (previously --memo)
+      --offline                  Offline mode (does not allow any online functionality
+  -o, --output string            Output format (text|json) (default "json")
+  -s, --sequence uint            The sequence number of the signing account (offline mode only)
+      --sign-mode string         Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint      Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                      Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register remove-resource-node \
+--network-address=<resource_node_address> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
stchaind tx register remove-resource-node \
+--network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+

Check the status update of the resource node

+
http://127.0.0.1:1317/register/deposit/address/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+
+

Response:

+
    {
+    "height": "173",
+    "result": {
+        "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+        "pubkey": {
+            "type": "tendermint/PubKeyEd25519",
+            "value": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+        },
+        "suspend": true,
+        "status": 2,
+        "tokens": "10000000000000000000",
+        "owner_address": "st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh",
+        "description": {
+            "moniker": "resource-nodeupdate",
+            "identity": "",
+            "website": "",
+            "security_contact": "",
+            "details": ""
+        },
+        "creation_time": "2023-01-10T18:16:14.738068297Z",
+        "node_type": 7,
+        "bonded_deposit": {
+            "denom": "wei",
+            "amount": "0"
+        },
+        "un_bonding_deposit": {
+            "denom": "wei",
+            "amount": "10000000000000000000"
+        },
+        "un_bonded_deposit": {
+            "denom": "wei",
+            "amount": "0"
+        }
+    }
+}
+
+


+

-create-meta-node🔗︎

+

Create a new meta node

+
Usage:
+  stchaind tx register create-meta-node [flags]
+
+Flags:
+  -a, --account-number uint       The account number of the signing account (offline mode only)
+      --amount string             Amount of coins to bond
+      --details string            The node's (optional) details
+      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                      help for create-meta-node
+      --identity string           The (optional) identity signature (ex. UPort or Keybase)
+      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                    Use a connected Ledger device
+      --moniker string            The node's name
+      --network-address string    The address of the PP node
+      --note string               Note to add a description to the transaction (previously --memo)
+      --offline                   Offline mode (does not allow any online functionality
+  -o, --output string             Output format (text|json) (default "json")
+      --pubkey string             The resource node's Protobuf JSON encoded public key
+      --security-contact string   The node's (optional) security contact email
+  -s, --sequence uint             The sequence number of the signing account (offline mode only)
+      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height
+      --website string            The node's (optional) website
+  -y, --yes                       Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register create-meta-node \
+--network-address=<network-address> \
+--amount=<amount> \
+--pubkey=<pubkey of meta node> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--moniker=<name of resource node>
+
+

Transaction example:

+
stchaind tx register create-meta-node \
+--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \
+--amount=10stos \
+--pubkey=stsdspub1zcjduepqv7sj69c52rsdu5m8nk6tg4v5y8fh43w2hl9aa7mp3qgr9ym0feyshrc4wv \
+--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \
+--moniker=meta-node0 \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-meta-node-reg-vote🔗︎

+

vote for the registration of a new meta node

+
Usage:
+  stchaind tx register meta-node-reg-vote [flags]
+
+Flags:
+  -a, --account-number uint                The account number of the signing account (offline mode only)
+      --candidate-network-address string    (default "The network address of the candidate PP node")
+      --candidate-owner-address string      (default "The owner address of the candidate PP node")
+      --dry-run                            ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string                 Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                         gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only                      Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                               help for meta-node-reg-vote
+      --keyring-dir string                 The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                             Use a connected Ledger device
+      --note string                        Note to add a description to the transaction (previously --memo)
+      --offline                            Offline mode (does not allow any online functionality
+      --opinion                            Opinion of the vote for the registration of Meta node.
+  -o, --output string                      Output format (text|json) (default "json")
+  -s, --sequence uint                      The sequence number of the signing account (offline mode only)
+      --sign-mode string                   Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint                Set a block timeout height to prevent the tx from being committed past a certain height
+      --voter-network-address string        (default "The address of the PP node that made the vote.")
+  -y, --yes                                Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+
+

Warning

+

A newly-created meta node needs 7 days by default to be voted by other active meta nodes

+
+

Example:

+
Usage:
+stchaind tx register meta-node-reg-vote \
+--candidate-network-address=<candidate-network-address> \
+--candidate-owner-address=<candidate-owner-address> \
+--opinion=<true|false> \
+--voter-network-address=<voter-network-address> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
stchaind tx register meta-node-reg-vote \
+--candidate-network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--candidate-owner-address=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--opinion=true \
+--voter-network-address=stsds13yakj2xgzzdfcw7kd5gtfcfv2k6sn5eg4vdfem \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-update-meta-node🔗︎

+

Update meta node info

+
Usage:
+  stchaind tx register update-meta-node [flags]
+
+Flags:
+  -a, --account-number uint       The account number of the signing account (offline mode only)
+      --details string            The node's (optional) details
+      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string                gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                      help for update-meta-node
+      --identity string           The (optional) identity signature (ex. UPort or Keybase)
+      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                    Use a connected Ledger device
+      --moniker string            The node's name
+      --network-address string    The address of the PP node
+      --note string               Note to add a description to the transaction (previously --memo)
+      --offline                   Offline mode (does not allow any online functionality
+  -o, --output string             Output format (text|json) (default "json")
+      --security-contact string   The node's (optional) security contact email
+  -s, --sequence uint             The sequence number of the signing account (offline mode only)
+      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height
+      --website string            The node's (optional) website
+  -y, --yes                       Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register update-meta-node \
+--network-address<network-address> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--moniker=<name of meta node>
+
+

Transaction example:

+
stchaind tx register update-meta-node \
+--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--moniker=meta-node \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-remove-meta-node🔗︎

+

Remove an meta node

+
Usage:
+  stchaind tx register remove-meta-node <meta_node_address> <owner_address> [flags]
+
+Flags:
+  -a, --account-number uint      The account number of the signing account (offline mode only)
+  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
+      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fees string              Fees to pay along with transaction; eg: 10gwei
+      --from string              Name or address of private key with which to sign
+      --gas string               gas limit to set per-transaction; set to "auto" to calculate required gas automatically (default 200000) (default "200000")
+      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
+      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10gwei)
+      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)
+  -h, --help                     help for remove-meta-node
+      --indent                   Add indent to JSON response
+      --keyring-backend string   Select keyring's backend (os|file|test) (default "os")
+      --ledger                   Use a connected Ledger device
+      --memo string              Memo to send along with transaction
+      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
+  -s, --sequence uint            The sequence number of the signing account (offline mode only)
+      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)
+  -y, --yes                      Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register remove-meta-node \
+--network-address=<meta_node_address> \
+--from=owner_address> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--gas=auto
+
+

Transaction example:

+
stchaind tx register remove-meta-node \
+--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+

Check if the meta node has been removed from the meta-node list using REST API

+
stchaind query register get-meta-node --network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca
+
+

Response:

+
    node:
+        creation_time: "2023-01-10T19:45:09.674241234Z"
+        description:
+        details: ""
+        identity: ""
+        moniker: meta-node0
+        security_contact: ""
+        website: ""
+        network_address: stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca
+        owner_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+        pubkey:
+        '@type': /cosmos.crypto.ed25519.PubKey
+        key: Z6EtFxRQ4N5TZ520tFWUIdN6xcq/y977YYgQMpNvTkk=
+        status: BOND_STATUS_UNBONDING
+        suspend: false
+        tokens: "10000000000000000000"
+
+


+

-update-meta-node-deposit🔗︎

+

update meta node's deposit

+
Usage:
+  stchaind tx register update-meta-node-deposit [flags]
+
+Flags:
+  -a, --account-number uint      The account number of the signing account (offline mode only)
+      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string       Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string               gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                     help for update-meta-node-deposit
+      --incr-deposit string      Boolean indicator of increase/decrease of deposit delta, true for increase and false for decrease
+      --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                   Use a connected Ledger device
+      --network-address string   The address of the PP node
+      --note string              Note to add a description to the transaction (previously --memo)
+      --offline                  Offline mode (does not allow any online functionality
+  -o, --output string            Output format (text|json) (default "json")
+  -s, --sequence uint            The sequence number of the signing account (offline mode only)
+      --sign-mode string         Choose sign mode (direct|amino-json), this is an advanced feature
+      --deposit-delta string     Deposit change of coins to be made (always positive like 100000gwei)
+      --timeout-height uint      Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                      Skip tx broadcasting prompt confirmation
+
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register update-meta-node-deposit \
+--network-address=<meta_node_address> \
+--from=<owner_address> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--deposit-delta=<delta_amount> \
+--incr-deposit=<true|false>
+
+

Transaction example:

+
stchaind tx register update-meta-node-deposit \
+--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--deposit-delta=100gwei \
+--incr-deposit=true \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-kick-meta-node-vote🔗︎

+

kick specified meta node by other meta nodes

+
Usage:
+  stchaind tx register kick-meta-node-vote [flags]
+
+Flags:
+  -a, --account-number uint             The account number of the signing account (offline mode only)
+      --aux                             Generate aux signer data instead of sending a tx
+  -b, --broadcast-mode string           Transaction broadcasting mode (sync|async) (default "sync")
+      --chain-id string                 The network chain ID
+      --dry-run                         ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it (when enabled, the local Keybase is not accessible)
+      --fee-granter string              Fee granter grants fees for the transaction
+      --fee-payer string                Fee payer pays fees for the transaction instead of deducting from the signer
+      --fees string                     Fees to pay along with transaction; eg: 10uatom
+      --from string                     Name or address of private key with which to sign
+      --gas string                      gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically. Note: "auto" option doesn't always report accurate results. Set a valid coin value to adjust the result. Can be used instead of "fees". (default 200000)
+      --gas-adjustment float            adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
+      --gas-prices string               Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom)
+      --generate-only                   Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase only accessed when providing a key name)
+  -h, --help                            help for kick-meta-node-vote
+      --keyring-backend string          Select keyring's backend (os|file|kwallet|pass|test|memory) (default "os")
+      --keyring-dir string              The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                          Use a connected Ledger device
+      --node string                     <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
+      --note string                     Note to add a description to the transaction (previously --memo)
+      --offline                         Offline mode (does not allow any online functionality)
+      --opinion                         Opinion of the vote for kicking meta node.
+  -o, --output string                   Output format (text|json) (default "json")
+  -s, --sequence uint                   The sequence number of the signing account (offline mode only)
+      --sign-mode string                Choose sign mode (direct|amino-json|direct-aux), this is an advanced feature
+      --target-network-address string   The network address of the meta node to be kicked
+      --timeout-height uint             Set a block timeout height to prevent the tx from being committed past a certain height
+      --tip string                      Tip is the amount that is going to be transferred to the fee payer on the target chain. This flag is only valid when used with --aux, and is ignored if the target chain didn't enable the TipDecorator
+      --voter-network-address string    The network address of the meta node that made the vote
+  -y, --yes                             Skip tx broadcasting prompt confirmation
+
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx register kick-meta-node-vote \
+--voter-network-address=<voter_meta_node_address> \
+--target-network-address=<target_meta_node_address> \
+--opinion=<true|false> \
+--from=<owner_address> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
stchaind tx register kick-meta-node-vote \
+--voter-network-address=stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64 \
+--target-network-address=stsds13yakj2xgzzdfcw7kd5gtfcfv2k6sn5eg4vdfem \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1gwei -y
+
+


+

-get-resource-nodes🔗︎

+

Query details about an individual resource node by its network address

+
Usage:
+  stchaind query register get-resource-node [flags]
+
+Flags:
+      --height int               Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help                     help for get-resource-node
+      --network-address string   The address of the PP node
+  -o, --output string            Output format (text|json) (default "text"
+
+

Example:

+

Query by network-address:

+
Usage:
+stchaind query register get-resource-node --network-address=<resource_node_address>
+
+

Transaction example:

+
stchaind query register get-resource-node --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+
+


+

-get-meta-nodes🔗︎

+

Query all meta nodes by network id or moniker

+
Usage:
+  stchaind query register get-meta-node [flags]
+
+Flags:
+      --height int               Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help                     help for get-meta-node
+      --network-address string   The address of the PP node
+  -o, --output string            Output format (text|json) (default "text")
+
+

Example:

+

Query by network address: +

Usage:
+stchaind query register get-meta-nodes --network-address=<meta_node_address>
+

+

Transaction example:

+
stchaind query register get-meta-node --network-address=stsds14c3em44vlh276cujnr2ez802uyjyeqrrsu9fuh
+
+


+

-get-resource-count🔗︎

+

Query the total number of bonded resource nodes

+
Usage:
+  stchaind query register get-resource-count [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for get-resource-count
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query register get-resource-count
+number: "2"
+
+


+

-get-meta-count🔗︎

+

Query the total number of bonded meta nodes

+
Usage:
+  stchaind query register get-meta-count [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for get-meta-count
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+

Example: +

stchaind query register get-meta-count
+number: "4"
+

+


+

-register-params🔗︎

+

Query values set as register parameters

+
Usage:
+  stchaind query register params [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for params
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query register params
+bond_denom: wei
+max_entries: 16
+resource_node_reg_enabled: true
+unbonding_completion_time: 1209600s
+unbonding_threashold_time: 15552000s
+
+


+
+

SDS Module🔗︎

+

-upload (transaction)🔗︎

+

Create and sign a file upload tx

+
Usage:
+  stchaind tx sds upload [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --file-hash string      The hash of uploaded file
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for upload
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+      --reporter string       The reporter address of meta node that reported the file
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+      --uploader string       The owner address of resource node that uploaded the file
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx sds upload \
+--file-hash=<file hash> \
+--uploader=<file uploader, owner address of resource node> \
+--reporter=<file reporter, meta node address> \
+--from=<Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
 stchaind tx sds upload \
+ --file-hash=001A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F \
+ --uploader=st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw \
+ --reporter=stsds14c3em44vlh276cujnr2ez802uyjyeqrrsu9fuh \
+ --from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+ --chain-id=mesos-1 \
+ --keyring-backend=test \
+ --gas=auto \
+ --gas-prices=1000000000wei -y
+
+


+

-prepay🔗︎

+

Create and sign a prepay tx

+
Usage:
+  stchaind tx sds prepay [from_address] [coins] [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for prepay
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx sds prepay <from_address, Name|address of private key> <coins> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend> \
+--gas=auto
+
+

Transaction example:

+
 stchaind tx sds prepay st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh 10stos \
+ --chain-id=mesos-1 \
+ --keyring-backend=test \
+ --gas=auto \
+ --gas-prices=1000000000wei -y
+
+


+

-upload (query)🔗︎

+

Query uploaded file info by hash

+
Usage:
+  stchaind query sds upload [file_hash] [flags]
+
+Flags:
+      --count-total       count total number of records in upload to query for
+      --height int        Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help              help for upload
+      --limit uint        pagination limit of upload to query for (default 100)
+      --offset uint       pagination offset of upload to query for
+  -o, --output string     Output format (text|json) (default "text")
+      --page uint         pagination page of upload to query for. This sets offset to a multiple of limit (default 1)
+      --page-key string   pagination page-key of upload to query for
+      --reverse           results are sorted in descending order
+
+

Example:

+
Usage:
+stchaind query sds upload <file hash>
+
+

Transaction example:

+
stchaind query sds upload 001A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F
+
+


+

-sds-params🔗︎

+

Query values set as sds parameters

+
Usage:
+  stchaind query sds params [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for params
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query sds params
+bond_denom: wei
+
+


+
+

Pot Module🔗︎

+

-foundation-deposit🔗︎

+

Deposit to foundation account

+
Usage:
+  stchaind tx pot foundation-deposit [flags]
+
+Flags:
+  -a, --account-number uint   The account number of the signing account (offline mode only)
+      --amount string         Amount of coins to withdraw
+      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string            gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                  help for foundation-deposit
+      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                Use a connected Ledger device
+      --note string           Note to add a description to the transaction (previously --memo)
+      --offline               Offline mode (does not allow any online functionality
+  -o, --output string         Output format (text|json) (default "json")
+  -s, --sequence uint         The sequence number of the signing account (offline mode only)
+      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature
+      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                   Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx pot foundation-deposit \
+--amount=<amount> \
+--from=<from_address, Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
stchaind tx pot foundation-deposit \
+--amount=40000stos \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei
+
+


+

-withdraw🔗︎

+

withdraw POT reward

+
Usage:
+  stchaind tx pot withdraw [flags]
+
+Flags:
+  -a, --account-number uint      The account number of the signing account (offline mode only)
+      --amount string            Amount of coins to withdraw
+  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
+      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fees string              Fees to pay along with transaction; eg: 10gwei
+      --from string              Name or address of private key with which to sign
+      --gas string               gas limit to set per-transaction; set to "auto" to calculate required gas automatically (default 200000) (default "200000")
+      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
+      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10gwei)
+      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)
+  -h, --help                     help for withdraw
+      --indent                   Add indent to JSON response
+      --keyring-backend string   Select keyring's backend (os|file|test) (default "os")
+      --ledger                   Use a connected Ledger device
+      --memo string              Memo to send along with transaction
+      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
+  -s, --sequence uint            The sequence number of the signing account (offline mode only)
+      --target-address string    The target account where the money is deposited after withdraw
+      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)
+  -y, --yes                      Skip tx broadcasting prompt confirmation
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx pot withdraw \
+--amount=<amount to withdraw> \
+--target-address=<wallet address of reciever> \
+--from=<from_address, Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
stchaind tx pot withdraw \
+--amount=100gwei \
+--target-address=st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh --chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-legacy-withdraw🔗︎

+

Temporarily used to withdraw POT reward recorded by legacy wallet address

+
Usage:
+  stchaind tx pot legacy-withdraw [flags]
+
+Flags:
+  -a, --account-number uint     The account number of the signing account (offline mode only)
+      --amount string           Amount of coins to withdraw
+      --dry-run                 ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
+      --fee-account string      Fee account pays fees for the transaction instead of deducting from the signer
+      --gas string              gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000)
+      --generate-only           Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)
+  -h, --help                    help for legacy-withdraw
+      --keyring-dir string      The client Keyring directory; if omitted, the default 'home' directory will be used
+      --ledger                  Use a connected Ledger device
+      --note string             Note to add a description to the transaction (previously --memo)
+      --offline                 Offline mode (does not allow any online functionality
+  -o, --output string           Output format (text|json) (default "json")
+  -s, --sequence uint           The sequence number of the signing account (offline mode only)
+      --sign-mode string        Choose sign mode (direct|amino-json), this is an advanced feature
+      --target-address string   The target wallet address to deposit into after withdrawing
+      --timeout-height uint     Set a block timeout height to prevent the tx from being committed past a certain height
+  -y, --yes                     Skip tx broadcasting prompt confirmation
+
+
+  In testing phase, --keyring-backend="test"
+
+

Example:

+
Usage:
+stchaind tx pot legacy-withdraw \
+--amount=<amount to withdraw> \
+--target-address=<wallet address of reciever> \
+--from=<from_address, Name|address of private key> \
+--chain-id=<current chain-id> \
+--keyring-backend=<keyring's backend>
+
+

Transaction example:

+
stchaind tx pot legacy-withdraw \
+--amount=100gwei \
+--target-address=st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx \
+--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \
+--chain-id=mesos-1 \
+--keyring-backend=test \
+--gas=auto \
+--gas-prices=1000000000wei -y
+
+


+

-report🔗︎

+

Query volume report by epoch

+
Usage:
+  stchaind query pot report [flags]
+
+Flags:
+      --epoch string    the epoch when this PoT message reported.
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for report
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query pot report --epoch=1
+
+


+

-pot-params🔗︎

+

Query values set as pot parameters

+
Usage:
+  stchaind query pot params [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for params
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query pot params 
+
+bond_denom: wei
+community_tax: "0.020000000000000000"
+initial_total_supply:
+  amount: "400000000000000000000000000"
+  denom: wei
+mature_epoch: "2016"
+mining_reward_params:
+- block_chain_percentage_in_bp: "2000"
+  meta_node_percentage_in_bp: "2000"
+  mining_reward:
+    amount: "80000000000000000000"
+    denom: wei
+  resource_node_percentage_in_bp: "6000"
+  total_mined_valve_end:
+    amount: "16819200000000000000000000"
+    denom: wei
+  total_mined_valve_start:
+    amount: "0"
+    denom: wei
+- block_chain_percentage_in_bp: "2000"
+  meta_node_percentage_in_bp: "1800"
+  mining_reward:
+    amount: "40000000000000000000"
+    denom: wei
+  resource_node_percentage_in_bp: "6200"
+  total_mined_valve_end:
+    amount: "25228800000000000000000000"
+    denom: wei
+  total_mined_valve_start:
+    amount: "16819200000000000000000000"
+    denom: wei
+- block_chain_percentage_in_bp: "2000"
+  meta_node_percentage_in_bp: "1600"
+  mining_reward:
+    amount: "20000000000000000000"
+    denom: wei
+  resource_node_percentage_in_bp: "6400"
+  total_mined_valve_end:
+    amount: "29433600000000000000000000"
+    denom: wei
+  total_mined_valve_start:
+    amount: "25228800000000000000000000"
+    denom: wei
+- block_chain_percentage_in_bp: "2000"
+  meta_node_percentage_in_bp: "1400"
+  mining_reward:
+    amount: "10000000000000000000"
+    denom: wei
+  resource_node_percentage_in_bp: "6600"
+  total_mined_valve_end:
+    amount: "31536000000000000000000000"
+    denom: wei
+  total_mined_valve_start:
+    amount: "29433600000000000000000000"
+    denom: wei
+- block_chain_percentage_in_bp: "2000"
+  meta_node_percentage_in_bp: "1200"
+  mining_reward:
+    amount: "5000000000000000000"
+    denom: wei
+  resource_node_percentage_in_bp: "6800"
+  total_mined_valve_end:
+    amount: "32587200000000000000000000"
+    denom: wei
+  total_mined_valve_start:
+    amount: "31536000000000000000000000"
+    denom: wei
+- block_chain_percentage_in_bp: "2000"
+  meta_node_percentage_in_bp: "1000"
+  mining_reward:
+    amount: "2500000000000000000"
+    denom: wei
+  resource_node_percentage_in_bp: "7000"
+  total_mined_valve_end:
+    amount: "40000000000000000000000000"
+    denom: wei
+  total_mined_valve_start:
+    amount: "32587200000000000000000000"
+    denom: wei
+reward_denom: wei
+
+


+
+

Tendermint🔗︎

+

Tendermint subcommands

+
Usage:
+  stchaind tendermint [command]
+
+Available Commands:
+  reset-state      Remove all the data and WAL
+  show-address     Shows this node's tendermint validator consensus address
+  show-node-id     Show this node's ID
+  show-validator   Show this node's tendermint validator info
+  unsafe-reset-all (unsafe) Remove all the data and WAL, reset this node's validator to genesis state
+  version          Print tendermint libraries' version
+
+Flags:
+  -h, --help   help for tendermint
+
+Global Flags:
+  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
+      --chain-id string          Specify Chain ID for sending Tx (default "testnet")
+      --fees string              Fees to pay along with transaction; eg: 10wei
+      --from string              Name or address of private key with which to sign
+      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
+      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10wei)
+      --home string              directory for config and data (default "/home/hong/.stchaind")
+      --keyring-backend string   Select keyring's backend (default "os")
+      --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")
+      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
+      --trace                    print out full stack trace on errors
+
+

-show-address🔗︎

+

Shows this node's tendermint validator consensus address

+
Usage:
+  stchaind tendermint show-address [flags]
+
+Flags:
+  -h, --help   help for show-address
+
+

Example:

+
stchaind tendermint show-address
+  stvalcons1rzn3d8qmgf7ejsfn77eag5zwjfufmvmu7sn802
+
+


+

-show-node-id🔗︎

+

Show this node's ID

+
Usage:
+  stchaind tendermint show-node-id [flags]
+
+Flags:
+  -h, --help   help for show-node-id
+
+

Example:

+
stchaind tendermint show-node-id
+  d3875ac126c90fa293f0591ad99cd587b6b5c6cc
+
+


+

-show-validator🔗︎

+

Show this node's tendermint validator info

+
Usage:
+  stchaind tendermint show-validator [flags]
+
+Flags:
+  -h, --help   help for show-validator
+
+

Example:

+
stchaind tendermint show-validator
+  {"@type":"/cosmos.crypto.ed25519.PubKey","key":"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo="}
+
+


+

-version🔗︎

+

Print protocols' and libraries' version numbers against which this app has been compiled

+
Usage:
+  stchaind tendermint version [flags]
+
+Flags:
+  -h, --help   help for version
+
+

Example:

+
stchaind tendermint version
+    tendermint: 0.34.21
+    abci: 0.17.0
+    blockprotocol: 11
+    p2pprotocol: 8
+
+


+
+

Others🔗︎

+

-init nodes🔗︎

+

Initialize validator's and node's configuration files.

+
Usage:
+  stchaind init [moniker] [flags]
+
+Flags:
+  -h, --help        help for init
+  -o, --overwrite   overwrite the genesis.json file
+      --recover     provide seed phrase to recover existing key instead of creating
+
+


+

-start st-chain🔗︎

+

Run the full node application with Tendermint in or out of process. By +default, the application will run with Tendermint in process.

+

Pruning options can be provided via the '--pruning' flag or alternatively with '--pruning-keep-recent', +'pruning-keep-every', and 'pruning-interval' together.

+

For '--pruning' the options are as follows:

+

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'

+

Node halting configurations exist in the form of two flags: '--halt-height' and '--halt-time'. During +the ABCI Commit phase, the node will check if the current block height is greater than or equal to +the halt-height or if the current block time is greater than or equal to the halt-time. If so, the +node will attempt to gracefully shutdown and the block will not be committed. In addition, the node +will not be able to commit subsequent blocks.

+

For profiling and benchmarking purposes, CPU profiling can be enabled via the '--cpu-profile' flag +which accepts a path for the resulting pprof file.

+
Usage:
+  stchaind start [flags]
+
+Flags:
+      --abci string                                     specify abci transport (socket | grpc) (default "socket")
+      --address string                                  Listen address (default "tcp://0.0.0.0:26658")
+      --api.enable                                      Defines if Cosmos-sdk REST server should be enabled
+      --api.enabled-unsafe-cors                         Defines if CORS should be enabled (unsafe - use it at your own risk)
+      --consensus.create_empty_blocks                   set this to false to only produce blocks when there are txs or when the AppHash changes (default true)
+      --consensus.create_empty_blocks_interval string   the possible interval between empty blocks (default "0s")
+      --consensus.double_sign_check_height int          how many blocks to look back to check existence of the node's consensus votes before joining consensus
+      --cpu-profile string                              Enable CPU profiling and write to the provided file
+      --db_backend string                               database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb (default "goleveldb")
+      --db_dir string                                   database directory (default "data")
+      --evm.max-tx-gas-wanted uint                      the gas wanted for each eth tx returned in ante handler in check tx mode (default 500000)
+      --evm.tracer string                               the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)
+      --fast_sync                                       fast blockchain syncing (default true)
+      --genesis_hash bytesHex                           optional SHA-256 hash of the genesis file
+      --grpc-web.address string                         The gRPC-Web server address to listen on (default "0.0.0.0:9091")
+      --grpc-web.enable                                 Define if the gRPC-Web server should be enabled. (Note gRPC must also be enabled.) (default true)
+      --grpc.address string                             the gRPC server address to listen on (default "0.0.0.0:9090")
+      --grpc.enable                                     Define if the gRPC server should be enabled (default true)
+      --halt-height uint                                Block height at which to gracefully halt the chain and shutdown the node
+      --halt-time uint                                  Minimum block time (in Unix seconds) at which to gracefully halt the chain and shutdown the node
+  -h, --help                                            help for start
+      --inter-block-cache                               Enable inter-block caching (default true)
+      --inv-check-period uint                           Assert registered invariants every N blocks
+      --json-rpc.address string                         the JSON-RPC server address to listen on (default "0.0.0.0:8545")
+      --json-rpc.api strings                            Defines a list of JSON-RPC namespaces that should be enabled (default [eth,net,web3])
+      --json-rpc.block-range-cap eth_getLogs            Sets the max block range allowed for eth_getLogs query (default 10000)
+      --json-rpc.enable                                 Define if the gRPC server should be enabled (default true)
+      --json-rpc.evm-timeout duration                   Sets a timeout used for eth_call (0=infinite) (default 5s)
+      --json-rpc.filter-cap int32                       Sets the global cap for total number of filters that can be created (default 200)
+      --json-rpc.gas-cap uint                           Sets a cap on gas that can be used in eth_call/estimateGas unit is gwei (0=infinite) (default 25000000)
+      --json-rpc.http-idle-timeout duration             Sets a idle timeout for json-rpc http server (0=infinite) (default 2m0s)
+      --json-rpc.http-timeout duration                  Sets a read/write timeout for json-rpc http server (0=infinite) (default 30s)
+      --json-rpc.logs-cap eth_getLogs                   Sets the max number of results can be returned from single eth_getLogs query (default 10000)
+      --json-rpc.txfee-cap float                        Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 gwei) (default 1)
+      --json-rpc.ws-address string                      the JSON-RPC WS server address to listen on (default "0.0.0.0:8546")
+      --min-retain-blocks uint                          Minimum block height offset during ABCI commit to prune Tendermint blocks
+      --minimum-gas-prices string                       Minimum gas prices to accept for transactions; Any fee in a tx must meet this minimum (e.g. 0.01stos)
+      --moniker string                                  node name (default "ubuntu")
+      --p2p.laddr string                                node listen address. (0.0.0.0:0 means any interface, any port) (default "tcp://0.0.0.0:26656")
+      --p2p.persistent_peers string                     comma-delimited ID@host:port persistent peers
+      --p2p.pex                                         enable/disable Peer-Exchange (default true)
+      --p2p.private_peer_ids string                     comma-delimited private peer IDs
+      --p2p.seed_mode                                   enable/disable seed mode
+      --p2p.seeds string                                comma-delimited ID@host:port seed nodes
+      --p2p.unconditional_peer_ids string               comma-delimited IDs of unconditional peers
+      --p2p.upnp                                        enable/disable UPNP port forwarding
+      --priv_validator_laddr string                     socket address to listen on for connections from external priv_validator process
+      --proxy_app string                                proxy app address, or one of: 'kvstore', 'persistent_kvstore', 'counter', 'e2e' or 'noop' for local testing. (default "tcp://127.0.0.1:26658")
+      --pruning string                                  Pruning strategy (default|nothing|everything|custom) (default "default")
+      --pruning-interval uint                           Height interval at which pruned heights are removed from disk (ignored if pruning is not 'custom')
+      --pruning-keep-every uint                         Offset heights to keep on disk after 'keep-every' (ignored if pruning is not 'custom')
+      --pruning-keep-recent uint                        Number of recent heights to keep on disk (ignored if pruning is not 'custom')
+      --rpc.grpc_laddr string                           GRPC listen address (BroadcastTx only). Port required
+      --rpc.laddr string                                RPC listen address. Port required (default "tcp://127.0.0.1:26657")
+      --rpc.pprof_laddr string                          pprof listen address (https://golang.org/pkg/net/http/pprof)
+      --rpc.unsafe                                      enabled unsafe rpc methods
+      --state-sync.snapshot-interval uint               State sync snapshot interval
+      --state-sync.snapshot-keep-recent uint32          State sync snapshot to keep (default 2)
+      --tls.certificate-path string                     the cert.pem file path for the server TLS configuration
+      --tls.key-path string                             the key.pem file path for the server TLS configuration
+      --trace-store string                              Enable KVStore tracing to an output file
+      --transport string                                Transport protocol: socket, grpc (default "socket")
+      --unsafe-skip-upgrades ints                       Skip a set of upgrade heights to continue the old binary
+      --with-tendermint                                 Run abci app embedded in-process with tendermint (default true)
+      --x-crisis-skip-assert-invariants                 Skip x/crisis invariants check on startup
+
+

Example:

+
stchaind start
+
+

Result:

+
stchaind start
+  11:40AM INF Unlocking keyring
+  11:40AM INF starting ABCI with Tendermint
+  11:40AM INF Starting multiAppConn service impl=multiAppConn module=proxy server=node
+  11:40AM INF Starting localClient service connection=query impl=localClient module=abci-client server=node
+  11:40AM INF Starting localClient service connection=snapshot impl=localClient module=abci-client server=node
+  11:40AM INF Starting localClient service connection=mempool impl=localClient module=abci-client server=node
+  11:40AM INF Starting localClient service connection=consensus impl=localClient module=abci-client server=node
+  11:40AM INF Starting EventBus service impl=EventBus module=events server=node
+  11:40AM INF Starting PubSub service impl=PubSub module=pubsub server=node
+  11:40AM INF Starting IndexerService service impl=IndexerService module=txindex server=node
+  11:40AM INF ABCI Handshake App Info hash="r�p=W\"��\x05v\x17K�\a �A?�/�����kĭ\x17W\x14}" height=2551 module=consensus protocol-version=0 server=node software-version=v0.8.0
+  11:40AM INF ABCI Replay Blocks appHeight=2551 module=consensus server=node stateHeight=2551 storeHeight=2551
+  11:40AM INF Completed ABCI Handshake - Tendermint and App are synced appHash="r�p=W\"��\x05v\x17K�\a �A?�/�����kĭ\x17W\x14}" appHeight=2551 module=consensus server=node
+  11:40AM INF Version info block=11 p2p=8 server=node tendermint_version=0.34.19
+  11:40AM INF This node is a validator addr=EA5F7899F5CC81675EA98BF329BB93CAE294B01C module=consensus pubKey=eYVLsz4XOB5HiadCpXxeUP48FTYrmFUGIe+hYv92E7I= server=node
+  11:40AM INF P2P Node ID ID=f8e9d6c5874feb1e9441380eb8e189ba88238d80 file=node/stchaind/config/node_key.json module=p2p server=node
+  11:40AM INF Adding persistent peers addrs=[] module=p2p server=node
+  11:40AM INF Adding unconditional peer ids ids=[] module=p2p server=node
+  11:40AM INF Add our address to book addr={"id":"f8e9d6c5874feb1e9441380eb8e189ba88238d80","ip":"0.0.0.0","port":26656} book=node/stchaind/config/addrbook.json module=p2p server=node
+  11:40AM INF Starting Node service impl=Node server=node
+  11:40AM INF Starting pprof server laddr=localhost:6060 server=node
+  11:40AM INF Starting RPC HTTP server on 127.0.0.1:26657 module=rpc-server server=node
+  11:40AM INF Starting P2P Switch service impl="P2P Switch" module=p2p server=node
+  11:40AM INF Starting Consensus service impl=ConsensusReactor module=consensus server=node
+  11:40AM INF Reactor  module=consensus server=node waitSync=false
+  11:40AM INF Starting State service impl=ConsensusState module=consensus server=node
+  11:40AM INF Starting baseWAL service impl=baseWAL module=consensus server=node wal=node/stchaind/data/cs.wal/wal
+  11:40AM INF Starting Group service impl=Group module=consensus server=node wal=node/stchaind/data/cs.wal/wal
+  11:40AM INF Starting TimeoutTicker service impl=TimeoutTicker module=consensus server=node
+  11:40AM INF Searching for height height=2552 max=0 min=0 module=consensus server=node wal=node/stchaind/data/cs.wal/wal
+  11:40AM INF Searching for height height=2551 max=0 min=0 module=consensus server=node wal=node/stchaind/data/cs.wal/wal
+  11:40AM INF Found height=2551 index=0 module=consensus server=node wal=node/stchaind/data/cs.wal/wal
+  11:40AM INF Catchup by replaying consensus messages height=2552 module=consensus server=node
+  11:40AM INF Replay: New Step height=2552 module=consensus round=0 server=node step=RoundStepNewHeight
+  11:40AM INF Replay: Done module=consensus server=node
+  11:40AM INF Starting Evidence service impl=Evidence module=evidence server=node
+  11:40AM INF Starting StateSync service impl=StateSync module=statesync server=node
+  11:40AM INF Starting PEX service impl=PEX module=pex server=node
+  11:40AM INF Starting AddrBook service book=node/stchaind/config/addrbook.json impl=AddrBook module=p2p server=node
+  11:40AM INF Starting Mempool service impl=Mempool module=mempool server=node
+  11:40AM INF Starting BlockchainReactor service impl=BlockchainReactor module=blockchain server=node
+  11:40AM INF Saving AddrBook to file book=node/stchaind/config/addrbook.json module=p2p server=node size=0
+  11:40AM INF Ensure peers module=pex numDialing=0 numInPeers=0 numOutPeers=0 numToDial=10 server=node
+  11:40AM INF No addresses to dial. Falling back to seeds module=pex server=node
+  11:40AM INF starting API server... server=api
+  11:40AM INF Starting RPC HTTP server on [::]:1317 server=api
+
+...
+
+


+

-config🔗︎

+

Create or query an application CLI configuration file.

+
Usage:
+  stchaind config <key> <value> [flags]
+
+Flags:
+      --get    print configuration value or its default if unset
+  -h, --help   help for config
+
+

Create Configuration Example:

+
stchaind config keyring-backend local-test
+  configuration saved to $HOME/.stchaind/config/client.toml
+
+

Query Configuration Example:

+
stchaind config keyring-backend
+  test
+
+


+

-keys🔗︎

+

Keyring management commands. These keys may be in any format supported by the +Tendermint crypto library and can be used by light-clients, full nodes, or any other application +that needs to sign with a private key.

+
The keyring supports the following backends:
+
+    os          Uses the operating system's default credentials store.
+    file        Uses encrypted file-based keystore within the app's configuration directory.
+                This keyring will request a password each time it is accessed, which may occur
+                multiple times in a single command resulting in repeated password prompts.
+    kwallet     Uses KDE Wallet Manager as a credentials management application.
+    pass        Uses the pass command line utility to store and retrieve keys.
+    test        Stores keys insecurely to disk. It does not prompt for a password to be unlocked
+                and it should be use only for testing purposes.
+
+kwallet and pass backends depend on external tools. Refer to their respective documentation for more
+information:
+    KWallet     https://github.com/KDE/kwallet
+    pass        https://www.passwordstore.org/
+
+The pass backend requires GnuPG: https://gnupg.org/
+
+Usage:
+  stchaind keys [command]
+
+Available Commands:
+
+
+  add                   Add an encrypted private key (either newly generated or recovered), encrypt it, and save to <name> file
+  delete                Delete the given keys
+  export                Export private keys
+  import                Import private keys into the local keybase
+  list                  List all keys
+  migrate               Migrate keys from the legacy (db-based) Keybase
+  mnemonic              Compute the bip39 mnemonic for some input entropy
+  parse                 Parse address from hex to bech32 and vice versa
+  show                  Retrieve key information by name or address
+  unsafe-export-eth-key **UNSAFE** Export an Ethereum private key
+  unsafe-import-eth-key **UNSAFE** Import Ethereum private keys into the local keybase
+
+Flags:
+  -h, --help                 help for keys
+      --keyring-dir string   The client Keyring directory; if omitted, the default 'home' directory will be used
+      --output string        Output format (text|json) (default "text")
+
+

Example:

+
stchaind keys list --keyring-backend=test
+
+

Result:

+
- name: user0
+  type: local
+  address: st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw
+  pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"A/wF15Wd3ogCXstE7S4Zf3DA4KXb0W7exQhP004PLTi3"}'
+  mnemonic: ""
+- name: user1
+  type: local
+  address: st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0
+  pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"AgnhB5EkHL8+jD0/zRDR11nIpfOirTRrjgCX6uibhmDW"}'
+  mnemonic: ""
+- name: user10
+  type: local
+  address: st1lkcrz3ktt2p7ppu9arglpqcn94pcdd9a9pmatf
+  pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"A2sZ2Z9BU9oDELC06Gj8Lfc5UycxTaPux3sEIq8sIzSW"}'
+  mnemonic: ""
+- name: user2
+  type: local
+  address: st16czjk2ym0prgvy4gl970t84vrp96s5kayfqmf2
+  pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"AwfcJTOVWdx6ai61cy8VGJ1SdWHzwm2CCmr/+PwSpFeR"}'
+  mnemonic: ""
+- name: user3
+  type: local
+  address: st17patveqxcq42rguc7nayr2g3jtawpzvhfmmumt
+  pubkey: '{"@type":"/stratos.crypto.v1.ethsecp256k1.PubKey","key":"AtFxbuB4s+2SYzImGPIBwe0H0mKCXbIPu1T63OvbgE/3"}'
+  mnemonic: ""
+
+


+

-status🔗︎

+

Query remote node for status.

+
Usage:
+  stchaind status [flags]
+
+Flags:
+  -h, --help   help for status
+
+

Example:

+
stchaind status
+
+

Result:

+
{
+    "NodeInfo": {
+        "protocol_version": {
+            "p2p": "8",
+            "block": "11",
+            "app": "0"
+        },
+        "id": "16a0758d175cbf5c08d41dffa73eb5c0190869ed",
+        "listen_addr": "tcp://0.0.0.0:26656",
+        "network": "test-chain",
+        "version": "0.34.21",
+        "channels": "40202122233038606100",
+        "moniker": "node",
+        "other": {
+            "tx_index": "on",
+            "rpc_address": "tcp://127.0.0.1:26657"
+        }
+    },
+    "SyncInfo": {
+        "latest_block_hash": "697A2DB243E5191C6D85285A2ADD4924526924969C6C70FE71827C9FE41D4373",
+        "latest_app_hash": "E978F87BB23D351B853F5F0CF9FBBBA4464FF5D7CE3746BF3E2357F28CBCE041",
+        "latest_block_height": "497",
+        "latest_block_time": "2023-01-11T01:10:37.562405326Z",
+        "earliest_block_hash": "139676534FECFA507D56A06B03BD528E70ACA6D4DB6560219707011966613DE4",
+        "earliest_app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+        "earliest_block_height": "1",
+        "earliest_block_time": "2023-01-09T17:08:58.4890503Z",
+        "catching_up": false
+    },
+    "ValidatorInfo": {
+        "Address": "18A7169C1B427D994133F7B3D4504E92789DB37C",
+        "PubKey": {
+            "type": "tendermint/PubKeyEd25519",
+            "value": "69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo="
+        },
+        "VotingPower": "500000"
+    }
+}
+
+


+

-version🔗︎

+

Print the application binary version information

+
Usage:
+  stchaind version [flags]
+
+Flags:
+  -h, --help            help for version
+      --long            Print long version information
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind version 
+  v0.9.0
+
+


+

-account🔗︎

+

Query for account by address.

+
Usage:
+  stchaind query account [address] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for account
+  -o, --output string   Output format (text|json) (default "text")
+
+

Example:

+
stchaind query account st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw
+
+

Result:

+
'@type': /stratos.types.v1.EthAccount
+base_account:
+  account_number: "0"
+  address: st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw
+  pub_key:
+    '@type': /stratos.crypto.v1.ethsecp256k1.PubKey
+    key: A/wF15Wd3ogCXstE7S4Zf3DA4KXb0W7exQhP004PLTi3
+  sequence: "4"
+code_hash: 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
+
+


+

-tendermint-validator-set🔗︎

+

Get the full tendermint validator set at given height

+
Usage:
+  stchaind query tendermint-validator-set [height] [flags]
+
+Flags:
+  -h, --help        help for tendermint-validator-set
+      --limit int   Query number of results returned per page (default 100)
+      --page int    Query a specific page of paginated results (default 1)
+
+

Example:

+
stchaind query tendermint-validator-set 1
+
+

Result:

+
block_height: "1"
+total: "1"
+validators:
+- address: stvalcons1rzn3d8qmgf7ejsfn77eag5zwjfufmvmu7sn802
+  proposer_priority: "0"
+  pub_key:
+    type: tendermint/PubKeyEd25519
+    value: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=
+  voting_power: "500000"
+
+


+

-block🔗︎

+

Get verified data for a block at given height.

+
Usage:
+  stchaind query block [height] [flags]
+
+Flags:
+  -h, --help   help for block
+
+

Example:

+
stchaind query block 150
+
+

Result:

+
{
+    "block_id": {
+        "hash": "74E410DF477CB2B54265160FE75B48E096BCF60A29F47B825EB017FAE1BB0263",
+        "parts": {
+            "total": 1,
+            "hash": "9870B5AAC0D6207850D7AC4D3072D5AC17C6AF120D50EB667E054D5613B12C6D"
+        }
+    },
+    "block": {
+        "header": {
+            "version": {
+                "block": "11"
+            },
+            "chain_id": "test-chain",
+            "height": "150",
+            "time": "2023-01-10T22:19:55.918496162Z",
+            "last_block_id": {
+                "hash": "56676AC4975414BD2BF86C29CBCC9124A97AF84E1654AC41862B520595E0E6A7",
+                "parts": {
+                    "total": 1,
+                    "hash": "B919897435939A560885651505D570FE93A77EA695F0E6A24F294E507F9F1BC9"
+                }
+            },
+            "last_commit_hash": "3435730FE67F2F8D2092DC384C42FBD4026DF749EE49DEEBBD4042F67B96911B",
+            "data_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            "validators_hash": "5234BD91A3A751E055C35876578DE4A466311A80D540B59885AF68EF6D4D56DE",
+            "next_validators_hash": "5234BD91A3A751E055C35876578DE4A466311A80D540B59885AF68EF6D4D56DE",
+            "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
+            "app_hash": "724DAFFA7A2B129A8E956D531DF4F24616E76D03976ED899F4DFBBE1FBF53B39",
+            "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            "proposer_address": "18A7169C1B427D994133F7B3D4504E92789DB37C"
+        },
+        "data": {
+            "txs": null
+        },
+        "evidence": {
+            "evidence": null
+        },
+        "last_commit": {
+            "height": "149",
+            "round": 0,
+            "block_id": {
+                "hash": "56676AC4975414BD2BF86C29CBCC9124A97AF84E1654AC41862B520595E0E6A7",
+                "parts": {
+                    "total": 1,
+                    "hash": "B919897435939A560885651505D570FE93A77EA695F0E6A24F294E507F9F1BC9"
+                }
+            },
+            "signatures": [
+                {
+                    "block_id_flag": 2,
+                    "validator_address": "18A7169C1B427D994133F7B3D4504E92789DB37C",
+                    "timestamp": "2023-01-10T22:19:55.918496162Z",
+                    "signature": "otYHnEyBJBM09TrcpX9CqwYGmgiJMErteqA5jUPFeplqGmIvZY7gHIzFfZh8RQKkN1umR1C0IyQypRvDQ2zJAw=="
+                }
+            ]
+        }
+    }
+}
+
+


+

-txs🔗︎

+

Search for transactions that match the exact given events where results are paginated. +Each event takes the form of '{eventType}.{eventAttribute}={value}'. Please refer +to each module's documentation for the full set of events to query for. Each module +documents its respective events under 'xx_events.md'.

+
Usage:
+  stchaind query txs [flags]
+
+Flags:
+      --events string   list of transaction events in the form of {eventType}.{eventAttribute}={value}
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for txs
+      --limit int       Query number of transactions results per page returned (default 30)
+  -o, --output string   Output format (text|json) (default "text")
+      --page int        Query a specific page of paginated results (default 1)
+
+Example:
+stchaind query txs --events 'message.sender=cosmos1...&message.action=withdraw_delegator_reward' --page 1 --limit 30
+
+

Example:

+
stchaind query txs \
+--events 'message.sender=st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k' \
+--chain-id=mesos-1 \
+--limit=20
+
+

Result:

+
  {
+    "total_count": "2",
+    "count": "2",
+    "page_number": "1",
+    "page_total": "1",
+    "limit": "20",
+    "txs": [
+        {
+            "height": "3681",
+            "txhash": "EA0AB730219917533E73B1509EC38AE26614B2A8C4C4EA4E90026262127E8672",
+            "raw_log": "[{\"msg_index\":0,\"log\":\"\",\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"vote\"},{\"key\":\"module\",\"value\":\"governance\"},{\"key\":\"sender\",\"value\":\"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\"}]},{\"type\":\"proposal_vote\",\"attributes\":[{\"key\":\"option\",\"value\":\"Yes\"},{\"key\":\"proposal_id\",\"value\":\"7\"}]}]}]",
+            "logs": [
+                {
+                    "msg_index": 0,
+                    "log": "",
+                    "events": [
+                        {
+                            "type": "message",
+                            "attributes": [
+                                {
+                                    "key": "action",
+                                    "value": "vote"
+                                },
+                                {
+                                    "key": "module",
+                                    "value": "governance"
+                                },
+                                {
+                                    "key": "sender",
+                                    "value": "st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k"
+                                }
+                            ]
+                        },
+                        {
+                            "type": "proposal_vote",
+                            "attributes": [
+                                {
+                                    "key": "option",
+                                    "value": "Yes"
+                                },
+                                {
+                                    "key": "proposal_id",
+                                    "value": "7"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ],
+            "gas_wanted": "200000",
+            "gas_used": "38472",
+            "tx": {
+                "type": "cosmos-sdk/StdTx",
+                "value": {
+                    "msg": [
+                        {
+                            "type": "cosmos-sdk/MsgVote",
+                            "value": {
+                                "proposal_id": "7",
+                                "voter": "st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k",
+                                "option": "Yes"
+                            }
+                        }
+                    ],
+                    "fee": {
+                        "amount": [],
+                        "gas": "200000"
+                    },
+                    "signatures": [
+                        {
+                            "pub_key": {
+                                "type": "tendermint/PubKeySecp256k1",
+                                "value": "A8h5ZfH926q3EMdHeOdT2Z5W1KDjOc3LT33quKK8uCdZ"
+                            },
+                            "signature": "yE56xpZ4OI3+HxQr5bklYHuAOspKlwVC7hiSKnja63khIlU+TTnEhgoRvNgYub58HVbOBtslHU7QncNKSWEEbg=="
+                        }
+                    ],
+                    "memo": ""
+                }
+            },
+            "timestamp": "2021-07-23T14:41:18Z"
+        },
+        {
+            "height": "4400",
+            "txhash": "D21722FE6C3DE53268EEAF1A9C433DACF635B2715F6B5DCFBD5EED7B28705BE8",
+            "raw_log": "[{\"msg_index\":0,\"log\":\"\",\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"vote\"},{\"key\":\"module\",\"value\":\"governance\"},{\"key\":\"sender\",\"value\":\"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\"}]},{\"type\":\"proposal_vote\",\"attributes\":[{\"key\":\"option\",\"value\":\"Yes\"},{\"key\":\"proposal_id\",\"value\":\"9\"}]}]}]",
+            "logs": [
+                {
+                    "msg_index": 0,
+                    "log": "",
+                    "events": [
+                        {
+                            "type": "message",
+                            "attributes": [
+                                {
+                                    "key": "action",
+                                    "value": "vote"
+                                },
+                                {
+                                    "key": "module",
+                                    "value": "governance"
+                                },
+                                {
+                                    "key": "sender",
+                                    "value": "st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k"
+                                }
+                            ]
+                        },
+                        {
+                            "type": "proposal_vote",
+                            "attributes": [
+                                {
+                                    "key": "option",
+                                    "value": "Yes"
+                                },
+                                {
+                                    "key": "proposal_id",
+                                    "value": "9"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ],
+            "gas_wanted": "200000",
+            "gas_used": "38508",
+            "tx": {
+                "type": "cosmos-sdk/StdTx",
+                "value": {
+                    "msg": [
+                        {
+                            "type": "cosmos-sdk/MsgVote",
+                            "value": {
+                                "proposal_id": "9",
+                                "voter": "st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k",
+                                "option": "Yes"
+                            }
+                        }
+                    ],
+                    "fee": {
+                        "amount": [],
+                        "gas": "200000"
+                    },
+                    "signatures": [
+                        {
+                            "pub_key": {
+                                "type": "tendermint/PubKeySecp256k1",
+                                "value": "A8h5ZfH926q3EMdHeOdT2Z5W1KDjOc3LT33quKK8uCdZ"
+                            },
+                            "signature": "+w/Qhm6JdyQLXsquiKe0WCqCNjqois2Zhc76h0AphDhQZTKlpD9qlVuA/BX7gmVrmiUdqG/G4YExu8XkQSvnSg=="
+                        }
+                    ],
+                    "memo": ""
+                }
+            },
+            "timestamp": "2021-07-25T00:36:47Z"
+        }
+    ]
+}
+
+


+

-tx🔗︎

+

Query for a transaction by hash in a committed block.

+
Example:
+stchaind query tx <hash>
+stchaind query tx --type=acc_seq <addr>/<sequence>
+stchaind query tx --type=signature <sig1_base64>,<sig2_base64...>
+
+Usage:
+  stchaind query tx --type=[hash|acc_seq|signature] [hash|acc_seq|signature] [flags]
+
+Flags:
+      --height int      Use a specific height to query state at (this can error if the node is pruning state)
+  -h, --help            help for tx
+  -o, --output string   Output format (text|json) (default "text")
+      --type string     The type to be used when querying tx, can be one of "hash", "acc_seq", "signature" (default "hash")
+
+

Example:

+
stchaind query tx AB0EF3761603145EDC1B4121C91B51001249186E1362E7148C82E7DB12F7BDF0
+
+

Result:

+
code: 0
+codespace: ""
+data: 0A1E0A1C2F636F736D6F732E62616E6B2E763162657461312E4D736753656E64
+events:
+- attributes:
+  - index: true
+    key: c3BlbmRlcg==
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  - index: true
+    key: YW1vdW50
+    value: MjAwMDAwMDAwMDAwMDAwd2Vp
+  type: coin_spent
+- attributes:
+  - index: true
+    key: cmVjZWl2ZXI=
+    value: c3QxN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWx2NWhqMnE=
+  - index: true
+    key: YW1vdW50
+    value: MjAwMDAwMDAwMDAwMDAwd2Vp
+  type: coin_received
+- attributes:
+  - index: true
+    key: cmVjaXBpZW50
+    value: c3QxN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWx2NWhqMnE=
+  - index: true
+    key: c2VuZGVy
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  - index: true
+    key: YW1vdW50
+    value: MjAwMDAwMDAwMDAwMDAwd2Vp
+  type: transfer
+- attributes:
+  - index: true
+    key: c2VuZGVy
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  type: message
+- attributes:
+  - index: true
+    key: ZmVl
+    value: MjAwMDAwMDAwMDAwMDAwd2Vp
+  - index: true
+    key: ZmVlX3BheWVy
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  type: tx
+- attributes:
+  - index: true
+    key: YWNjX3NlcQ==
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamgvMw==
+  type: tx
+- attributes:
+  - index: true
+    key: c2lnbmF0dXJl
+    value: N0ZtZ0Irc1RuUDVLazRxMTIxWXlWZEpKa2RFcTNHaW95ZHU4ZlRQK3B4b01DL1RsNzd1SmxDUkJhblNQN2p4MXhFandUeHQzem5HTDlLTlFMUkFBMlFBPQ==
+  type: tx
+- attributes:
+  - index: true
+    key: YWN0aW9u
+    value: L2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZA==
+  type: message
+- attributes:
+  - index: true
+    key: c3BlbmRlcg==
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  - index: true
+    key: YW1vdW50
+    value: MTAwMDAwMDAwMHdlaQ==
+  type: coin_spent
+- attributes:
+  - index: true
+    key: cmVjZWl2ZXI=
+    value: c3Qxc3F6c2s4bXBsdjUyNDhneDZkZGR6enh3ZXF2ZXc4cnRzdDk2Zng=
+  - index: true
+    key: YW1vdW50
+    value: MTAwMDAwMDAwMHdlaQ==
+  type: coin_received
+- attributes:
+  - index: true
+    key: cmVjaXBpZW50
+    value: c3Qxc3F6c2s4bXBsdjUyNDhneDZkZGR6enh3ZXF2ZXc4cnRzdDk2Zng=
+  - index: true
+    key: c2VuZGVy
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  - index: true
+    key: YW1vdW50
+    value: MTAwMDAwMDAwMHdlaQ==
+  type: transfer
+- attributes:
+  - index: true
+    key: c2VuZGVy
+    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=
+  type: message
+- attributes:
+  - index: true
+    key: bW9kdWxl
+    value: YmFuaw==
+  type: message
+gas_used: "88709"
+gas_wanted: "200000"
+height: "611"
+info: ""
+logs:
+- events:
+  - attributes:
+    - key: receiver
+      value: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx
+    - key: amount
+      value: 1000000000wei
+    type: coin_received
+  - attributes:
+    - key: spender
+      value: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+    - key: amount
+      value: 1000000000wei
+    type: coin_spent
+  - attributes:
+    - key: action
+      value: /cosmos.bank.v1beta1.MsgSend
+    - key: sender
+      value: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+    - key: module
+      value: bank
+    type: message
+  - attributes:
+    - key: recipient
+      value: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx
+    - key: sender
+      value: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+    - key: amount
+      value: 1000000000wei
+    type: transfer
+  log: ""
+  msg_index: 0
+raw_log: '[{"events":[{"type":"coin_received","attributes":[{"key":"receiver","value":"st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx"},{"key":"amount","value":"1000000000wei"}]},{"type":"coin_spent","attributes":[{"key":"spender","value":"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh"},{"key":"amount","value":"1000000000wei"}]},{"type":"message","attributes":[{"key":"action","value":"/cosmos.bank.v1beta1.MsgSend"},{"key":"sender","value":"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh"},{"key":"module","value":"bank"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx"},{"key":"sender","value":"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh"},{"key":"amount","value":"1000000000wei"}]}]}]'
+timestamp: "2023-01-11T01:20:11Z"
+tx:
+  '@type': /cosmos.tx.v1beta1.Tx
+  auth_info:
+    fee:
+      amount:
+      - amount: "200000000000000"
+        denom: wei
+      gas_limit: "200000"
+      granter: ""
+      payer: ""
+    signer_infos:
+    - mode_info:
+        single:
+          mode: SIGN_MODE_DIRECT
+      public_key:
+        '@type': /stratos.crypto.v1.ethsecp256k1.PubKey
+        key: Agkwb1xacHBqeqGBIqRacXgf0qKTnEBPCEtH2vTE01Ke
+      sequence: "3"
+  body:
+    extension_options: []
+    memo: ""
+    messages:
+    - '@type': /cosmos.bank.v1beta1.MsgSend
+      amount:
+      - amount: "1000000000"
+        denom: wei
+      from_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+      to_address: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx
+    non_critical_extension_options: []
+    timeout_height: "0"
+  signatures:
+  - 7FmgB+sTnP5Kk4q121YyVdJJkdEq3Gioydu8fTP+pxoMC/Tl77uJlCRBanSP7jx1xEjwTxt3znGL9KNQLRAA2QA=
+txhash: AB0EF3761603145EDC1B4121C91B51001249186E1362E7148C82E7DB12F7BDF0
+
+


+

-export🔗︎

+

Export state to JSON.

+
Usage:
+  stchaind export [flags]
+
+Flags:
+      --for-zero-height              Export state to start at height zero (perform preproccessing)
+      --height int                   Export state from a particular height (-1 means latest height) (default -1)
+  -h, --help                         help for export
+      --jail-allowed-addrs strings   Comma-separated list of operator addresses of jailed validators to unjail
+
+

Example:

+
stchaind export > dump.json
+
+


+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/stratos-chain-grpc-queries/index.html b/docs-stratos-chain/stratos-chain-grpc-queries/index.html new file mode 100644 index 0000000..bd97746 --- /dev/null +++ b/docs-stratos-chain/stratos-chain-grpc-queries/index.html @@ -0,0 +1,3677 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Stratos Chain stchaind gRPC queries - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

gRPC Queries

+ +

Cosmos SDK gRPC definitions have been documented here

+

Register Module🔗︎

+


+
+

gRPC Gateway🔗︎

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
ResourceNodeQueryResourceNodeRequest
fields:{"network_addr":string}
QueryResourceNodeResponse
fields:{"node":ResourceNode}
Get info of a registered resource node
MetaNodeQueryMetaNodeRequest
fields:{"network_addr":string}
QueryMetaNodeResponse
fields:{"node":MetaNode}
Get info of a registered meta node
ParamsQueryParamsRequest
fields:{}
QueryParamsResponse
fields:{"params":Params}
Get params of Register Module
DepositByNodeQueryDepositByNodeRequest
fields:{"network_addr":string, query_type:uint32}
QueryDepositByNodeResponse
fields:{"deposit_info":DepositInfo }
Get deposit info of a specific node
DepositByOwnerQueryDepositByOwnerRequest
fields:{"owner_addr":string}
QueryDepositByOwnerResponse
fields:{"deposit_infos":[]DepositInfo,
"pagination": cosmos.base.query.v1beta1.PageResponse }
Get all deposit info of a specific owner
DepositTotalQueryDepositTotalRequest
fields:{}
QueryDepositTotalResponse
fields:{"resource_nodes_total_deposit":cosmos.base.v1beta1.Coin,
"meta_nodes_total_deposit":cosmos.base.v1beta1.Coin,
"total_bonded_deposit":cosmos.base.v1beta1.Coin,
"total_unbonded_deposit":cosmos.base.v1beta1.Coin,
"total_unbonding_deposit":cosmos.base.v1beta1.Coin}
Query total deposit state of all registered resource nodes and meta nodes
BondedResourceNodeCountQueryBondedResourceNodeCountRequest
fields:{}
QueryBondedResourceNodeCountResponse
fields:{"number": uint64}
Get params of Register Module
BondedMetaNodeCountQueryBondedMetaNodeCountRequest
fields:{}
QueryBondedMetaNodeCountResponse
fields:{"number": uint64}
Get params of Register Module
RemainingOzoneLimitQueryRemainingOzoneLimitRequest
fields:{}
QueryRemainingOzoneLimitResponse
fields:{"ozone_limit": string}
+


+
+

ResourceNode:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
network_addressstring
pubkeygoogle.protobuf.Any
suspendbool
statuscosmos.staking.v1beta1.BondStatus
tokensstring
owner_addressstring
descriptionDescription
creation_timegoogle.protobuf.Timestamp
node_typeuint32
effective_tokensstring
beneficiary_addressstring
+


+
+

MetaNode:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
network_addressstring
pubkeygoogle.protobuf.Any
suspendbool
statuscosmos.staking.v1beta1.BondStatus
tokensstring
owner_addressstring
descriptionDescription
creation_timegoogle.protobuf.Timestamp
beneficiary_addressstring
+


+
+

Description:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
monikerstring
identitystring
websitestring
security_contactstring
detailsstring
+


+
+

Params:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
bond_denomstring
unbonding_threashold_timegoogle.protobuf.Duration
unbonding_completion_timegoogle.protobuf.Duration
max_entriesuint32
resource_node_reg_enabledbool
resource_node_min_depositcosmos.base.v1beta1.Coin
voting_periodgoogle.protobuf.Duration
+


+
+

DepositInfo:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
network_addressstring
pubkeygoogle.protobuf.Any
suspendbool
statuscosmos.staking.v1beta1.BondStatus
tokensstring
owner_addressstring
descriptionDescription
creation_timegoogle.protobuf.Timestamp
node_typeuint32
bonded_depositcosmos.base.v1beta1.Coin
un_bonding_depositcosmos.base.v1beta1.Coin
un_bonded_depositcosmos.base.v1beta1.Coin
+


+

- List🔗︎

+

List all available grpc queries in Register Module

+

Request:

+

grpcurl -plaintext 127.0.0.1:9090 list stratos.register.v1.Query
+
+Response:

+
stratos.register.v1.Query.ResourceNode
+stratos.register.v1.Query.MetaNode
+stratos.register.v1.Query.Params
+stratos.register.v1.Query.DepositByNode
+stratos.register.v1.Query.DepositByOwner
+stratos.register.v1.Query.DepositTotal
+stratos.register.v1.Query.BondedResourceNodeCount
+stratos.register.v1.Query.BondedMetaNodeCount
+stratos.register.v1.Query.RemainingOzoneLimit
+
+


+

- ResourceNode🔗︎

+

Get info of a registered resource node

+

Request:

+
grpcurl -plaintext -d '{"network_addr":"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv"}' 127.0.0.1:9090 stratos.register.v1.Query.ResourceNode
+
+

Response:

+
{
+  "node": {
+    "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+    "pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+    },
+    "suspend": true,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "1000000000000000000",
+    "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "description": {
+      "moniker": "resource-node0",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "2024-03-08T19:18:51.591341919Z",
+    "node_type": 4,
+    "effective_tokens": "0",
+    "beneficiary_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+  }
+}
+
+


+

- MetaNode🔗︎

+

Get info of a registered meta node

+

Request:

+
grpcurl -plaintext -d '{"network_addr":"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64"}' 127.0.0.1:9090 stratos.register.v1.Query.MetaNode
+
+

Response:

+
{
+  "node": {
+    "network_address": "stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64",
+    "pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ="
+    },
+    "suspend": false,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "100000000000000000000",
+    "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "description": {
+      "moniker": "snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "0001-01-01T00:00:00Z",
+    "beneficiary_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+  }
+}
+
+


+

- Params🔗︎

+

Get params of Register Module

+

Request:

+
grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.Params
+
+

Response:

+
{
+  "params": {
+    "bond_denom": "wei",
+    "unbonding_threashold_time": "15552000s",
+    "unbonding_completion_time": "1209600s",
+    "max_entries": 16,
+    "resource_node_reg_enabled": true,
+    "resource_node_min_deposit": {
+      "denom": "wei",
+      "amount": "1000000000000000000"
+    },
+    "voting_period": "604800s"
+  }
+}
+
+


+

- DepositByNode🔗︎

+

Get deposit info of a specific node

+

Request:

+
grpcurl -plaintext -d '{"network_addr":"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv","query_type": 0 }' 127.0.0.1:9090 stratos.register.v1.Query.DepositByNode
+
+

Response:

+
{
+  "deposit_info": {
+    "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+    "pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+    },
+    "suspend": true,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "1000000000000000000",
+    "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "description": {
+      "moniker": "resource-node0",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "2024-03-08T19:18:51.591341919Z",
+    "node_type": 4,
+    "bonded_deposit": {
+      "denom": "wei",
+      "amount": "1000000000000000000"
+    },
+    "un_bonding_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    },
+    "un_bonded_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    }
+  }
+}
+
+


+

- DepositByOwner🔗︎

+

Get all deposit info of a specific owner

+

Request:

+
grpcurl -plaintext -d '{"owner_addr":"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m", "pagination": {"limit":20}}' 127.0.0.1:9090 stratos.register.v1.Query.DepositByOwner
+
+

Response:

+
{
+  "deposit_infos": [
+    {
+      "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+      "pubkey": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+      },
+      "suspend": true,
+      "status": "BOND_STATUS_BONDED",
+      "tokens": "1000000000000000000",
+      "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "description": {
+        "moniker": "resource-node0",
+        "identity": "",
+        "website": "",
+        "security_contact": "",
+        "details": ""
+      },
+      "creation_time": "2024-03-08T19:18:51.591341919Z",
+      "node_type": 4,
+      "bonded_deposit": {
+        "denom": "wei",
+        "amount": "1000000000000000000"
+      },
+      "un_bonding_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      },
+      "un_bonded_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      }
+    },
+    {
+      "network_address": "stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64",
+      "pubkey": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ="
+      },
+      "suspend": false,
+      "status": "BOND_STATUS_BONDED",
+      "tokens": "100000000000000000000",
+      "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "description": {
+        "moniker": "snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888",
+        "identity": "",
+        "website": "",
+        "security_contact": "",
+        "details": ""
+      },
+      "creation_time": "0001-01-01T00:00:00Z",
+      "node_type": 0,
+      "bonded_deposit": {
+        "denom": "wei",
+        "amount": "100000000000000000000"
+      },
+      "un_bonding_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      },
+      "un_bonded_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      }
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "2"
+  }
+}
+
+


+

- DepositTotal🔗︎

+

Query total deposit state of all registered resource nodes and meta nodes

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.DepositTotal
+
+

Response:

+
{
+  "resource_nodes_total_deposit": {
+    "denom": "wei",
+    "amount": "1000000000000000000"
+  },
+  "meta_nodes_total_deposit": {
+    "denom": "wei",
+    "amount": "400000000000000000000"
+  },
+  "total_bonded_deposit": {
+    "denom": "wei",
+    "amount": "401000000000000000000"
+  },
+  "total_unbonded_deposit": {
+    "denom": "wei",
+    "amount": "0"
+  },
+  "total_unbonding_deposit": {
+    "denom": "wei",
+    "amount": "0"
+  }
+}
+
+


+

- BondedResourceNodeCount🔗︎

+

Queries total number of Bonded ResourceNodes

+

Request:

+
grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.BondedResourceNodeCount
+
+

Response:

+
{
+  "number": "2"
+}
+
+


+

- BondedMetaNodeCount🔗︎

+

Queries total number of Bonded MetaNodes

+

Request:

+
grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.BondedMetaNodeCount
+
+

Response:

+
{
+  "number": "4"
+}
+
+


+

- RemainingOzoneLimit🔗︎

+

Queries the current remaining ozone limit

+

Request:

+
grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.RemainingOzoneLimit
+
+

Response:

+
{
+  "ozone_limit": "400000000000000"
+}
+
+


+
+

SDS Module🔗︎

+

gRPC Gateway🔗︎

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
FileuploadQueryFileUploadRequest
fields:{"file_hash":string}
QueryFileUploadResponse
fields:{"file_info":FileInfo}
Query uploaded file info by hash
SimPrepayQuerySimPrepayRequest
fields:{"amount":string}
QuerySimPrepayResponse
fields:{"noz":string}
Simulate prepay to query the noz that can be purchased at the current price
NozPriceQueryNozPriceRequest
fields:{}
QueryNozPriceResponse
fields:{"price":string}
Query the current price of noz
NozSupplyQueryNozSupplyRequest
fields:{}
QueryNozSupplyResponse
fields:{"remaining":string,"total":string}
Query noz supply
ParamsQueryParamsRequest
fields:{}
QueryParamsResponse
fields:{"params":Params}
Get params of SDS Module
+

FileInfo:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
heightstring
reportersbytes
uploaderstring
+

Params:

+ + + + + + + + + + + + + + + +
FieldTypeLabel
bond_denomstring
+

- List🔗︎

+

List all available grpc queries in SDS Module

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 list stratos.sds.v1.Query
+
+

Response:

+
stratos.sds.v1.Query.Fileupload
+stratos.sds.v1.Query.SimPrepay
+stratos.sds.v1.Query.NozPrice
+stratos.sds.v1.Query.NozSupply
+stratos.sds.v1.Query.Params
+
+


+

- Fileupload🔗︎

+

Query uploaded file info by hash

+

Request:

+
 grpcurl -plaintext -d '{"file_hash":"v05ahm51dd62ise3fo7ojqub90p0ql2c3jg37hk8"}' 127.0.0.1:9090 stratos.sds.v1.Query.Fileupload
+
+

Response:

+
{
+    "file_info": {
+        "height": "4109",
+        "reporters": "DwAAAAAAAAA=",
+        "uploader": "st18986jyng5vsprmtzkdxla80jrw7qyc6wl73h0u"
+    }
+}
+
+


+

- SimPrepay🔗︎

+

Simulate prepay to query the noz that can be purchased at the current price

+

Request:

+
 grpcurl -plaintext -d '{"amount":"1stos"}' 127.0.0.1:9090 stratos.sds.v1.Query.SimPrepay
+
+

Response:

+
{
+  "noz": "949522847536"
+}
+
+


+

- NozPrice🔗︎

+

Query the current price of noz

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 stratos.sds.v1.Query.NozPrice
+
+

Response:

+
{
+    "price": "1012791644248016784459322"
+}
+
+


+

- NozSupply🔗︎

+

Query noz supply

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 stratos.sds.v1.Query.NozSupply
+
+

Response:

+
{
+    "remaining": "7949398620856330560",
+    "total": "8000080000000000000"
+}
+
+


+

- Params🔗︎

+

Get params of SDS Module

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 stratos.sds.v1.Query.Params
+
+

Response:

+
{
+    "params": {
+        "bond_denom": "wei"
+    }
+}
+
+


+
+

POT Module🔗︎

+

gRPC Gateway🔗︎

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
VolumeReportQueryVolumeReportRequest
fields:{"epoch":int64}
QueryVolumeReportResponse
fields:{"report_info":ReportInfo }
Get pot volume report by epoch
RewardsByEpochQueryRewardsByEpochRequest
fields:{"epoch":int64,
"pagination":cosmos.base.query.v1beta1.PageRequest}
QueryRewardsByEpochResponse
fields:{"rewards":[]Reward,
"pagination":cosmos.base.query.v1beta1.PageResponse}
Query pot reward by epoch
RewardsByWalletQueryRewardsByWalletRequest
fields:{"wallet_address":string}
QueryRewardsByWalletResponse
fields:{"rewards":RewardByWallet}
Get pot reward by beneficiary address
RewardsByWalletAndEpochQueryRewardsByWalletAndEpochRequest
fields:{"wallet_address":string,
"epoch":int64,
"pagination":cosmos.base.query.v1beta1.PageRequest}
QueryRewardsByWalletAndEpochResponse
fields:{"rewards":[]Reward,
"pagination":cosmos.base.query.v1beta1.PageResponse}
Get pot reward by beneficiary address and epoch
SlashingByOwnerQuerySlashingByOwnerRequest
fields:{"wallet_address":string}
QuerySlashingByOwnerResponse
fields:{"slashing":string}
Get pot slashing by owner
ParamsQueryParamsRequest
fields:{}
QueryParamsResponse
fields:{"params":Params}
Get params of POT Module
TotalMinedTokenQueryTotalMinedTokenRequest
fields:{}
QueryTotalMinedTokenResponse
fields:{"total_mined_token": cosmos.base.v1beta1.Coin}
Get total mined token
CirculationSupplyQueryCirculationSupplyRequest
fields:{}
QueryCirculationSupplyResponse
fields:{"circulation_supply":[]cosmos.base.v1beta1.Coin}
Get circulation supply
+

ReportInfo:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
epochint64
referencestring
tx_hashstring
reporterstring
+

Reward:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
wallet_addressstring
reward_from_mining_poolcosmos.base.v1beta1.Coinrepeated
reward_from_traffic_poolcosmos.base.v1beta1.Coinrepeated
+

RewardByWallet:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
wallet_addressstring
mature_total_rewardcosmos.base.v1beta1.Coinrepeated
immature_total_rewardcosmos.base.v1beta1.Coinrepeated
+

Params:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
bond_denomstring
reward_denomstring
mature_epochint64
mining_reward_paramsMiningRewardParamrepeated
community_taxstring
initial_total_supplycosmos.base.v1beta1.Coin
+

MiningRewardParam:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabel
total_mined_valve_startcosmos.base.v1beta1.Coin
total_mined_valve_endcosmos.base.v1beta1.Coin
mining_rewardcosmos.base.v1beta1.Coin
block_chain_percentage_in_bpstring
resource_node_percentage_in_bpstring
meta_node_percentage_in_bpstring
+

- List🔗︎

+

List all available grpc queries in POT Module

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 list stratos.pot.v1.Query
+
+

Response:

+
stratos.pot.v1.Query.VolumeReport
+stratos.pot.v1.Query.RewardsByEpoch
+stratos.pot.v1.Query.RewardsByWallet
+stratos.pot.v1.Query.RewardsByWalletAndEpoch
+stratos.pot.v1.Query.SlashingByOwner
+stratos.pot.v1.Query.Params
+stratos.pot.v1.Query.TotalMinedToken
+stratos.pot.v1.Query.CirculationSupply
+
+


+

- VolumeReport🔗︎

+

Get pot volume report by epoch

+

Request:

+
grpcurl -plaintext -d '{"epoch": 1 }' 127.0.0.1:9090 stratos.pot.v1.Query.VolumeReport
+
+

Response:

+
{
+  "report_info": {
+    "epoch": "1",
+    "reference": "100A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F",
+    "tx_hash": "7F51147DB44185A1A4DC572EC0C69DEA6E9495DDCDF27CD46CA27935D4B93943",
+    "reporter": "stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64"
+  }
+}
+
+


+

- RewardsByEpoch🔗︎

+

Query pot reward by epoch

+

Request:

+
grpcurl -plaintext -d '{"epoch": 1}' 127.0.0.1:9090 stratos.pot.v1.Query.RewardsByEpoch
+
+

Response:

+
{
+  "rewards": [
+    {
+      "wallet_address": "st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax",
+      "reward_from_mining_pool": [
+        {
+          "denom": "wei",
+          "amount": "4000000000000000000"
+        }
+      ],
+      "reward_from_traffic_pool": [
+        {
+          "denom": "wei",
+          "amount": "25740279520266"
+        }
+      ]
+    },
+    {
+      "wallet_address": "st1k9hfqps9s2tpnfxch2avvevyvtry0zth39gdzc",
+      "reward_from_mining_pool": [
+        {
+          "denom": "wei",
+          "amount": "4000000000000000000"
+        }
+      ],
+      "reward_from_traffic_pool": [
+        {
+          "denom": "wei",
+          "amount": "25740279520266"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": "y0JUWCEwpMwgs3XzfSwlHBHU9Xg=",
+    "total": "0"
+  }
+}
+
+


+

- RewardsByWallet🔗︎

+

Get pot reward by beneficiary address

+

Request:

+
grpcurl -plaintext -d '{"wallet_address": "st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax"} ' 127.0.0.1:9090 stratos.pot.v1.Query.RewardsByWallet
+
+

Response:

+
{
+  "rewards": {
+    "wallet_address": "st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax",
+    "mature_total_reward": [],
+    "immature_total_reward": [
+      {
+        "denom": "wei",
+        "amount": "16000257399827064713"
+      }
+    ]
+  }
+}
+
+


+

- RewardsByWalletAndEpoch🔗︎

+

Get pot reward by beneficiary address and epoch

+

Request:

+
grpcurl -plaintext -d '{"wallet_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m", "epoch": 2} ' 127.0.0.1:9090 stratos.pot.v1.Query.RewardsByWalletAndEpoch
+
+

Response:

+
{
+  "rewards": [
+    {
+      "wallet_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "reward_from_mining_pool": [
+        {
+          "denom": "wei",
+          "amount": "52000000000000000000"
+        }
+      ],
+      "reward_from_traffic_pool": [
+        {
+          "denom": "wei",
+          "amount": "669244695117639"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "0"
+  }
+}
+
+

- SlashingByOwner🔗︎

+

Get pot slashing by owner

+

Request:

+
grpcurl -plaintext -d '{"wallet_address": "st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw"} ' 127.0.0.1:9090 stratos.pot.v1.Query.SlashingByOwner
+
+

Response:

+
{
+ "slashing": "0"
+}
+
+


+

- Params🔗︎

+

Get params of POT Module

+

Request:

+
 grpcurl -plaintext 127.0.0.1:9090 stratos.pot.v1.Query.Params
+
+

Response:

+
{
+  "params": {
+    "bond_denom": "wei",
+    "reward_denom": "wei",
+    "mature_epoch": "2016",
+    "mining_reward_params": [
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "0"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "16819200000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "80000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6000",
+        "meta_node_percentage_in_bp": "2000"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "16819200000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "25228800000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "40000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6200",
+        "meta_node_percentage_in_bp": "1800"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "25228800000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "29433600000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "20000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6400",
+        "meta_node_percentage_in_bp": "1600"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "29433600000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "31536000000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "10000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6600",
+        "meta_node_percentage_in_bp": "1400"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "31536000000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "32587200000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "5000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6800",
+        "meta_node_percentage_in_bp": "1200"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "32587200000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "40000000000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "2500000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "7000",
+        "meta_node_percentage_in_bp": "1000"
+      }
+    ],
+    "community_tax": "0.020000000000000000",
+    "initial_total_supply": {
+      "denom": "wei",
+      "amount": "100000000000000000000000000"
+    }
+  }
+}
+
+


+

- TotalMinedToken🔗︎

+

Get total mined token

+

Request:

+
grpcurl -plaintext 127.0.0.1:9090 stratos.pot.v1.Query.TotalMinedToken
+
+

Response:

+
{
+  "total_mined_token": {
+    "denom": "wei",
+    "amount": "959999999923"
+  }
+}
+
+


+

- CirculationSupply🔗︎

+

Get circulation supply

+

Request:

+
grpcurl -plaintext 127.0.0.1:9090 stratos.pot.v1.Query.CirculationSupply
+
+

Response: +

{
+  "circulation_supply": [
+    {
+      "denom": "wei",
+      "amount": "441331088285529367702468752"
+    }
+  ]
+}
+

+


+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-stratos-chain/stratos-chain-rest-apis/index.html b/docs-stratos-chain/stratos-chain-rest-apis/index.html new file mode 100644 index 0000000..fd272b7 --- /dev/null +++ b/docs-stratos-chain/stratos-chain-rest-apis/index.html @@ -0,0 +1,7061 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Stratos Chain stchaind REST APIs - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +

REST APIs

+ +

Overview🔗︎

+

Generally, all the APIs provided here could be grouped into HTTP GET and POST requests. We classified these APIs into sections based on their modules or their operations for an in-depth analysis.

+
    +
  • GET Request
  • +
+

The response content type is application/json

+
    +
  • POST Request
  • +
+

The response content type is application/json. If it has a request body, the request content is also in application/json format.

+

A POST request will return an unsigned transaction, which equals to its equivalent stchaind command with a --generate-only flag.

+
+

Stratos-chain REST APIs🔗︎

+
+

Tip

+

Replace rest.thestratos.org with rest.thestratos.org for Testnet queries.

+
+

Node Status🔗︎

+
+ GET /status      queries information about the connected node + +Request Example: +
https://rpc.thestratos.org/status
+
+Response Example: +
{
+  "jsonrpc": "2.0",
+  "id": -1,
+  "result": {
+    "node_info": {
+      "protocol_version": {
+        "p2p": "8",
+        "block": "11",
+        "app": "0"
+      },
+      "id": "173ebeb219ae7e8d53e7882063429213b9176b6f",
+      "listen_addr": "tcp://0.0.0.0:26656",
+      "network": "testchain",
+      "version": "0.37.2",
+      "channels": "40202122233038606100",
+      "moniker": "node",
+      "other": {
+        "tx_index": "on",
+        "rpc_address": "tcp://127.0.0.1:26657"
+      }
+    },
+    "sync_info": {
+      "latest_block_hash": "0F9E487D5536E51A394674DA4238D7A9A6FC5B6914337C85B2246736DCA920C6",
+      "latest_app_hash": "2163AE296ACA24085E56D9DC422EC530A3DA99925E621DCA9DDDC51FBF70B50F",
+      "latest_block_height": "1155",
+      "latest_block_time": "2024-03-07T22:52:06.74704475Z",
+      "earliest_block_hash": "351DCDB243332806931B7FCD220C442E03A69AD97004CB2078F70ADEA38DB52A",
+      "earliest_app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+      "earliest_block_height": "1",
+      "earliest_block_time": "2024-03-07T14:14:09.179630523Z",
+      "catching_up": false
+    },
+    "validator_info": {
+      "address": "05949FEF030908686B36079C8BE958EE412D8744",
+      "pub_key": {
+        "type": "tendermint/PubKeyEd25519",
+        "value": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+      },
+      "voting_power": "504000000000000"
+    }
+  }
+}
+
+
+


+
+

Tendermint RPC🔗︎

+

Tendermint APIs, such as query blocks, transactions and validator set

+
+ GET /block?height={height}       queries a block at a specific {height} + +Request Example: +
https://rpc.thestratos.org/block?height=3
+
+Response Example: +
{
+  "jsonrpc": "2.0",
+  "id": -1,
+  "result": {
+    "block_id": {
+      "hash": "0D743AAB873C590EAEE65A82036B0E2719A8C5FB6BCC6AD4BFE5E16A6D2384D9",
+      "parts": {
+        "total": 1,
+        "hash": "9AEE29A0BCF4478CB648760024DC1BC62A0CF1E7CD8F518F5A952C6A51A4C519"
+      }
+    },
+    "block": {
+      "header": {
+        "version": {
+          "block": "11"
+        },
+        "chain_id": "testchain",
+        "height": "3",
+        "time": "2024-03-07T21:15:18.727039882Z",
+        "last_block_id": {
+          "hash": "47380D904092AD1CAB0D6EE05529108E1C16DDA57DA548F92B808826B57BFC2F",
+          "parts": {
+            "total": 1,
+            "hash": "5636DB87347A6B6688311A8337BC072B42F6A711A79B03E059669AC18BA369F8"
+          }
+        },
+        "last_commit_hash": "EE243348801D7A14265326D57A87F5411514DF4488E0F9A0D1CB5EFA4C59302E",
+        "data_hash": "880D0616234E0498E005E4BE6D14CD2B4B973808CBC5123F6CB94B55F412CE1E",
+        "validators_hash": "FC72D5166A86C81AFD8405DD7788E9C56531E8AA69A1ADDD1C1F3132D2A665CD",
+        "next_validators_hash": "FC72D5166A86C81AFD8405DD7788E9C56531E8AA69A1ADDD1C1F3132D2A665CD",
+        "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
+        "app_hash": "2879EC791843B2FA808D7914D8554252F9724A8ADD953806AC5CE48405233B1C",
+        "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+        "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+        "proposer_address": "05949FEF030908686B36079C8BE958EE412D8744"
+      },
+      "data": {
+        "txs": [
+          "CtgCCtUCCiUvY29zbW9zLmdvdi52MWJldGExLk1zZ1N1Ym1pdFByb3Bvc2FsEqsCCv0BCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEsoBChR1cGRhdGUgdm90aW5nIHBhcmFtcxIUdXBkYXRlIHZvdGluZyBwZXJpb2QaLwoDZ292Egx2b3RpbmdwYXJhbXMaGnsidm90aW5nX3BlcmlvZCI6ICI4NjQwMCJ9GmsKA2dvdhINZGVwb3NpdHBhcmFtcxpVeyJtaW5fZGVwb3NpdCI6IFt7ImRlbm9tIjogIndlaSIsImFtb3VudCI6ICIxMDAwMDAwIn1dLCJtYXhfZGVwb3NpdF9wZXJpb2QiOiAiODY0MDAifRopc3QxZWRwOWdrcHB4emp2Y2c5bndoZWg2dHA5cnNnYWZhdGNrZmRsNm0SdwpXCk0KJi9zdHJhdG9zLmNyeXB0by52MS5ldGhzZWNwMjU2azEuUHViS2V5EiMKIQNBlPndlLdbenThBfi5/mQPaDXY4fL0x4Vm+/PEzgiFKxIECgIIARgBEhwKFgoDd2VpEg83MTk0ODYwMDAwMDAwMDAQ/vQrGkFPkIR+nuWxlSCMABNwvragzNLy0REfuAJibSYiA05YfiDwdIYtUhgvZXvD02Kh4YbVSmVIY0IyiesiHP3884EYAA=="
+        ]
+      },
+      "evidence": {
+        "evidence": []
+      },
+      "last_commit": {
+        "height": "2",
+        "round": 0,
+        "block_id": {
+          "hash": "47380D904092AD1CAB0D6EE05529108E1C16DDA57DA548F92B808826B57BFC2F",
+          "parts": {
+            "total": 1,
+            "hash": "5636DB87347A6B6688311A8337BC072B42F6A711A79B03E059669AC18BA369F8"
+          }
+        },
+        "signatures": [
+          {
+            "block_id_flag": 2,
+            "validator_address": "05949FEF030908686B36079C8BE958EE412D8744",
+            "timestamp": "2024-03-07T21:15:18.727039882Z",
+            "signature": "QwMSz37OTLM0nBLnfg2ct7FdjZRyA8nYhi+vFRUK3Wb2boX/OiKN6r/LUxo/JxwCkhsXJWJI/HOnHV+SE6qYDA=="
+          }
+        ]
+      }
+    }
+  }
+}
+
+
+


+
+ GET /validators?height={height}       queries validator set at certain {height} + +Request Example: +
https://rpc.thestratos.org/validators?height=800
+
+Response Example: +
{
+  "jsonrpc": "2.0",
+  "id": -1,
+  "result": {
+    "block_height": "800",
+    "validators": [
+      {
+        "address": "05949FEF030908686B36079C8BE958EE412D8744",
+        "pub_key": {
+          "type": "tendermint/PubKeyEd25519",
+          "value": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+        },
+        "voting_power": "504000000000000",
+        "proposer_priority": "0"
+      }
+    ],
+    "count": "1",
+    "total": "1"
+  }
+}
+
+
+


+
+

Auth🔗︎

+
+ GET /cosmos/auth/v1beta1/accounts       queries the account information on blockchain + +Request Example: +
https://rest.thestratos.org/cosmos/auth/v1beta1/accounts
+
+Response Example: +
{
+  "accounts": [
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax",
+      "pub_key": null,
+      "account_number": "7",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st1fz67scxv3hjy0nxafuf0c4made74gfcf7myjqg",
+        "pub_key": null,
+        "account_number": "15",
+        "sequence": "0"
+      },
+      "name": "meta_node_bonded_pool",
+      "permissions": [
+        "minter"
+      ]
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3fkaac2",
+        "pub_key": null,
+        "account_number": "11",
+        "sequence": "0"
+      },
+      "name": "bonded_tokens_pool",
+      "permissions": [
+        "burner",
+        "staking"
+      ]
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st1tygms3xhhs3yv487phx3dw4a95jn7t7lakpvw7",
+        "pub_key": null,
+        "account_number": "12",
+        "sequence": "0"
+      },
+      "name": "not_bonded_tokens_pool",
+      "permissions": [
+        "burner",
+        "staking"
+      ]
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1vvysda6ylqz2adauqg4djsz4rx6hv6mqv9fepp",
+      "pub_key": null,
+      "account_number": "3",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw",
+        "pub_key": null,
+        "account_number": "13",
+        "sequence": "0"
+      },
+      "name": "gov",
+      "permissions": [
+        "burner"
+      ]
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx",
+      "pub_key": null,
+      "account_number": "1",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8mjswgz",
+        "pub_key": null,
+        "account_number": "10",
+        "sequence": "0"
+      },
+      "name": "distribution",
+      "permissions": [
+        "burner"
+      ]
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9",
+      "pub_key": null,
+      "account_number": "2",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1k9hfqps9s2tpnfxch2avvevyvtry0zth39gdzc",
+      "pub_key": null,
+      "account_number": "8",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "pub_key": {
+        "@type": "/stratos.crypto.v1.ethsecp256k1.PubKey",
+        "key": "A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr"
+      },
+      "account_number": "0",
+      "sequence": "2"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1ewlfmhl8j0p2jesfd2xrqp0qjeh2222gs9uefh",
+      "pub_key": null,
+      "account_number": "6",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st1m3h30wlvsf8llruxtpukdvsy0km2kum85un2xa",
+        "pub_key": null,
+        "account_number": "14",
+        "sequence": "0"
+      },
+      "name": "mint",
+      "permissions": [
+        "minter"
+      ]
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st1a8ngk4tjvuxneyuvyuy9nvgehkpfa38hm8mp3x",
+      "pub_key": null,
+      "account_number": "5",
+      "sequence": "0"
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.ModuleAccount",
+      "base_account": {
+        "address": "st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q",
+        "pub_key": null,
+        "account_number": "9",
+        "sequence": "0"
+      },
+      "name": "fee_collector",
+      "permissions": []
+    },
+    {
+      "@type": "/cosmos.auth.v1beta1.BaseAccount",
+      "address": "st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4",
+      "pub_key": null,
+      "account_number": "4",
+      "sequence": "0"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "16"
+  }
+}
+
+
+


+
+ GET /cosmos/auth/v1beta1/accounts/{address}       queries the account information on blockchain + +Request Example: +
https://rest.thestratos.org/cosmos/auth/v1beta1/accounts/st1v33vxhmu9kp9yrncfldvt0zg9qlcepc75lyggk
+
+Response Example: +
{
+    "account": {
+        "@type": "/cosmos.auth.v1beta1.BaseAccount",
+        "address": "st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh",
+        "pub_key": {
+            "@type": "/stratos.crypto.v1.ethsecp256k1.PubKey",
+            "key": "Agkwb1xacHBqeqGBIqRacXgf0qKTnEBPCEtH2vTE01Ke"
+        },
+        "account_number": "0",
+        "sequence": "4"
+    }
+}
+
+
+


+
+ GET /cosmos/auth/v1beta1/params       queries all parameters of Auth module. + +Request Example: +
https://rest.thestratos.org/cosmos/auth/v1beta1/params
+
+Response Example: +
{
+    "params": {
+        "max_memo_characters": "256",
+        "tx_sig_limit": "7",
+        "tx_size_cost_per_byte": "1000",
+        "sig_verify_cost_ed25519": "59000",
+        "sig_verify_cost_secp256k1": "100000"
+    }
+}
+
+
+ +


+
+

Bank🔗︎

+
+ GET /cosmos/bank/v1beta1/balances/{address}       queries the balance of all coins for a single account + +Request Example: +
https://rest.thestratos.org/cosmos/bank/v1beta1/balances/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh
+
+Response Example: +
{
+  "balances": [
+    {
+      "denom": "wei",
+      "amount": "99991399999400000000000000"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/bank/v1beta1/params       queries the parameters of Bank module. + +Request Example: +
https://rest.thestratos.org/cosmos/bank/v1beta1/params
+
+Response Example: +
{
+    "params": {
+        "send_enabled": [],
+        "default_send_enabled": true
+    }
+}
+
+
+


+
+ GET /cosmos/bank/v1beta1/supply       returns total supply of coins in the chain + +Request Example: +
https://rest.thestratos.org/cosmos/bank/v1beta1/supply
+
+Response Example: +
{
+  "supply": [
+    {
+      "denom": "wei",
+      "amount": "100000000000000000000000000"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/bank/v1beta1/supply/by_denom?denom={denom}       queries the supply of a single coin + +Request Example: +
https://rest.thestratos.org/cosmos/bank/v1beta1/supply/by_denom?denom=wei
+
+Response Example: +
{
+    "amount": {
+        "denom": "wei",
+        "amount": "21000519539308644119443444"
+    }
+}
+
+
+ +


+
+

Distribution🔗︎

+
+ GET /cosmos/distribution/v1beta1/community_pool       queries the community pool coins + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/community_pool
+
+Response Example: +
{
+    "pool": [
+        {
+            "denom": "wei",
+            "amount": "10529239257213782433.160000000000000000"
+        }
+    ]
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards       queries the total rewards accrued by each validator. + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/rewards
+
+Response Example: +
{
+    "rewards": [
+        {
+            "validator_address": "stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu",
+            "reward": [
+                {
+                    "denom": "wei",
+                    "amount": "470444828785397799437.412000000000000000"
+                }
+            ]
+        }
+    ],
+    "total": [
+        {
+            "denom": "wei",
+            "amount": "470444828785397799437.412000000000000000"
+        }
+    ]
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}       queries the total rewards accrued by a delegation + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/rewards/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+
+ +Response Example: +
{
+    "rewards": [
+        {
+            "denom": "wei",
+            "amount": "513182961214751918939.940000000000000000"
+        }
+    ]
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/validators       queries the validators of a delegator + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/validators
+
+ +Response Example: +
{
+    "validators": [
+        "stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu"
+    ]
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address       queries withdraw address of a delegator + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/withdraw_address
+
+ +Response Example: +
{
+  "withdraw_address": "st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh"
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/validators/{validator_address}/commission       queries accumulated commission for a validator. + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu/commission
+
+Response Example: +
{
+    "commission": {
+        "commission": [
+            {
+                "denom": "wei",
+                "amount": "61811505831634070383.438000000000000000"
+            }
+        ]
+    }
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/validators/{validatorAddr}       queries validator distribution information + +Request Example: +
https://rest.thestratos.org//cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu
+
+Response Example: +
{
+  "operator_address": "st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh",
+  "self_bond_rewards": [
+    {
+      "denom": "wei",
+      "amount": "589121578147958674973.028000000000000000"
+    }
+  ],
+  "commission": [
+    {
+      "denom": "wei",
+      "amount": "65457953127550963885.892000000000000000"
+    }
+  ]
+}
+
+
+


+
+ GET /cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards       queries outstanding rewards of a validator address + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu/outstanding_rewards
+
+Response Example: +
{
+    "rewards": {
+        "rewards": [
+            {
+                "denom": "wei",
+                "amount": "664331752904189049948.100000000000000000"
+            }
+        ]
+    }
+}
+
+
+ +


+
+ GET /cosmos/distribution/v1beta1/validators/{validator_address}/slashes       queries slash events of a validator + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu/slashes
+
+Response Example: +
{
+    "slashes": [
+    ],
+    "pagination": {
+        "next_key": null,
+        "total": "0"
+    }
+}
+
+
+ +


+
+ GET /cosmos/distribution/v1beta1/params       queries params of the distribution module + +Request Example: +
https://rest.thestratos.org/cosmos/distribution/v1beta1/params
+
+Response Example: +
{
+    "params": {
+        "community_tax": "0.020000000000000000",
+        "base_proposer_reward": "0.010000000000000000",
+        "bonus_proposer_reward": "0.040000000000000000",
+        "withdraw_addr_enabled": true
+    }
+}
+
+
+ +


+
+

Gov🔗︎

+
+ GET /cosmos/gov/v1/proposals       queries all proposals information + + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals
+
+Response Example: +
{
+  "proposals": [
+    {
+      "id": "1",
+      "messages": [
+        {
+          "@type": "/cosmos.gov.v1.MsgExecLegacyContent",
+          "content": {
+            "@type": "/cosmos.params.v1beta1.ParameterChangeProposal",
+            "title": "update voting params",
+            "description": "update voting period",
+            "changes": [
+              {
+                "subspace": "gov",
+                "key": "votingparams",
+                "value": "{\"voting_period\": \"86400\"}"
+              },
+              {
+                "subspace": "gov",
+                "key": "depositparams",
+                "value": "{\"min_deposit\": [{\"denom\": \"wei\",\"amount\": \"1000000\"}],\"max_deposit_period\": \"86400\"}"
+              }
+            ]
+          },
+          "authority": "st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw"
+        }
+      ],
+      "status": "PROPOSAL_STATUS_DEPOSIT_PERIOD",
+      "final_tally_result": {
+        "yes_count": "0",
+        "abstain_count": "0",
+        "no_count": "0",
+        "no_with_veto_count": "0"
+      },
+      "submit_time": "2024-03-07T20:26:22.453900094Z",
+      "deposit_end_time": "2024-03-09T20:26:22.453900094Z",
+      "total_deposit": [
+        {
+          "denom": "wei",
+          "amount": "10000000000"
+        }
+      ],
+      "voting_start_time": null,
+      "voting_end_time": null,
+      "metadata": "",
+      "title": "update voting params",
+      "summary": "update voting period",
+      "proposer": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/proposals?{params}       queries proposals information with parameters + +Parameters: +
+ voter               voter address
++ depositor           depositor addressvoter address
++ proposal_status     status of the proposals
+
+ +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals?status=PROPOSAL_STATUS_DEPOSIT_PERIOD
+
+Response Example: +
{
+  "proposals": [
+    {
+      "id": "1",
+      "messages": [
+        {
+          "@type": "/cosmos.gov.v1.MsgExecLegacyContent",
+          "content": {
+            "@type": "/cosmos.params.v1beta1.ParameterChangeProposal",
+            "title": "update voting params",
+            "description": "update voting period",
+            "changes": [
+              {
+                "subspace": "gov",
+                "key": "votingparams",
+                "value": "{\"voting_period\": \"86400\"}"
+              },
+              {
+                "subspace": "gov",
+                "key": "depositparams",
+                "value": "{\"min_deposit\": [{\"denom\": \"wei\",\"amount\": \"1000000\"}],\"max_deposit_period\": \"86400\"}"
+              }
+            ]
+          },
+          "authority": "st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw"
+        }
+      ],
+      "status": "PROPOSAL_STATUS_DEPOSIT_PERIOD",
+      "final_tally_result": {
+        "yes_count": "0",
+        "abstain_count": "0",
+        "no_count": "0",
+        "no_with_veto_count": "0"
+      },
+      "submit_time": "2024-03-07T20:26:22.453900094Z",
+      "deposit_end_time": "2024-03-09T20:26:22.453900094Z",
+      "total_deposit": [
+        {
+          "denom": "wei",
+          "amount": "10000000000"
+        }
+      ],
+      "voting_start_time": null,
+      "voting_end_time": null,
+      "metadata": "",
+      "title": "update voting params",
+      "summary": "update voting period",
+      "proposer": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/proposals/{proposal_id}       queries proposal details based on ProposalID + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals/1
+
+Response Example: +
{
+  "proposal": {
+    "id": "1",
+    "messages": [
+      {
+        "@type": "/cosmos.gov.v1.MsgExecLegacyContent",
+        "content": {
+          "@type": "/cosmos.params.v1beta1.ParameterChangeProposal",
+          "title": "update voting params",
+          "description": "update voting period",
+          "changes": [
+            {
+              "subspace": "gov",
+              "key": "votingparams",
+              "value": "{\"voting_period\": \"86400\"}"
+            },
+            {
+              "subspace": "gov",
+              "key": "depositparams",
+              "value": "{\"min_deposit\": [{\"denom\": \"wei\",\"amount\": \"1000000\"}],\"max_deposit_period\": \"86400\"}"
+            }
+          ]
+        },
+        "authority": "st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw"
+      }
+    ],
+    "status": "PROPOSAL_STATUS_DEPOSIT_PERIOD",
+    "final_tally_result": {
+      "yes_count": "0",
+      "abstain_count": "0",
+      "no_count": "0",
+      "no_with_veto_count": "0"
+    },
+    "submit_time": "2024-03-07T20:26:22.453900094Z",
+    "deposit_end_time": "2024-03-09T20:26:22.453900094Z",
+    "total_deposit": [
+      {
+        "denom": "wei",
+        "amount": "10000000000"
+      }
+    ],
+    "voting_start_time": null,
+    "voting_end_time": null,
+    "metadata": "",
+    "title": "update voting params",
+    "summary": "update voting period",
+    "proposer": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+  }
+}
+
+
+ +


+
+ GET /cosmos/gov/v1/proposals/{proposal_id}/deposits       queries all deposits of a single proposal + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/deposits
+
+Response Example: +
{
+  "deposits": [
+    {
+      "proposal_id": "1",
+      "depositor": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "amount": [
+        {
+          "denom": "wei",
+          "amount": "10000000000"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor}       queries single deposit information based proposalID, depositAddr + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/deposits/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m
+
+Response Example: +
{
+  "deposit": {
+    "proposal_id": "1",
+    "depositor": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "amount": [
+      {
+        "denom": "wei",
+        "amount": "10000000000"
+      }
+    ]
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/proposals/{proposal_id}/votes       queries votes of a given proposal + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/votes
+
+Response Example: +
{
+  "votes": [
+    {
+      "proposal_id": "1",
+      "voter": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "options": [
+        {
+          "option": "VOTE_OPTION_YES",
+          "weight": "1.000000000000000000"
+        }
+      ],
+      "metadata": ""
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/proposals/{proposal_id}/votes/{voter}       queries voted information based on proposalID, voterAddr + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/votes/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m
+
+Response Example: +
{
+  "vote": {
+    "proposal_id": "1",
+    "voter": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "options": [
+      {
+        "option": "VOTE_OPTION_YES",
+        "weight": "1.000000000000000000"
+      }
+    ],
+    "metadata": ""
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/proposals/{proposal_id}/tally       queries the tally of a proposal vote + +Request Example: +
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/tally
+
+Response Example: +
{
+  "tally": {
+    "yes_count": "500000000000000000000",
+    "abstain_count": "0",
+    "no_count": "0",
+    "no_with_veto_count": "0"
+  }
+}
+
+
+


+
+ GET /cosmos/gov/v1/params/{params_type}       queries all parameters of the gov module + +Request Example: + +
+ params_type      params_type defines which parameters to query for, can be one of "voting", "tallying" or "deposit".
+
+ +
https://rest.thestratos.org/cosmos/gov/v1/params/deposit
+
+Response Example: +
{
+  "voting_params": null,
+  "deposit_params": {
+    "min_deposit": [
+      {
+        "denom": "wei",
+        "amount": "10000000"
+      }
+    ],
+    "max_deposit_period": "172800s"
+  },
+  "tally_params": null,
+  "params": {
+    "min_deposit": [
+      {
+        "denom": "wei",
+        "amount": "10000000"
+      }
+    ],
+    "max_deposit_period": "172800s",
+    "voting_period": "172800s",
+    "quorum": "0.334000000000000000",
+    "threshold": "0.500000000000000000",
+    "veto_threshold": "0.334000000000000000",
+    "min_initial_deposit_ratio": "0.000000000000000000",
+    "burn_vote_quorum": false,
+    "burn_proposal_deposit_prevote": false,
+    "burn_vote_veto": true
+  }
+}
+
+
+ +


+
+

Mint🔗︎

+
+ GET /cosmos/mint/v1beta1/params       queries mint module parameters + +Request Example: +
https://rest.thestratos.org/cosmos/mint/v1beta1/params
+
+Response Example: +
{
+  "params": {
+    "mint_denom": "wei",
+    "inflation_rate_change": "0.130000000000000000",
+    "inflation_max": "0.200000000000000000",
+    "inflation_min": "0.070000000000000000",
+    "goal_bonded": "0.670000000000000000",
+    "blocks_per_year": "6311520"
+  }
+}
+
+
+


+
+ GET /cosmos/mint/v1beta1/inflation       queries current minting inflation value + +Request Example: +
https://rest.thestratos.org/cosmos/mint/v1beta1/inflation
+
+Response Example: +
{
+  "inflation": "0.130016465508894587"
+}
+
+
+


+
+ GET /cosmos/mint/v1beta1/annual_provisions       queries current minting annual provisions value + +Request Example: +
https://rest.thestratos.org/cosmos/mint/v1beta1/annual_provisions
+
+Response Example: +
{
+  "annual_provisions": "130019024060848.545708142618272810"
+}
+
+
+


+
+

Slashing🔗︎

+
+ GET /cosmos/slashing/v1beta1/signing_infos       queries signing info of all validators + +Request Example: +
https://rest.thestratos.org/cosmos/slashing/v1beta1/signing_infos
+
+Response Example: +
{
+  "info": [
+    {
+      "address": "stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp",
+      "start_height": "0",
+      "index_offset": "195",
+      "jailed_until": "1970-01-01T00:00:00Z",
+      "tombstoned": false,
+      "missed_blocks_counter": "0"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/slashing/v1beta1/params       queries the current slashing parameters + +Request Example: +
https://rest.thestratos.org/cosmos/slashing/v1beta1/params
+
+Response Example: +
{
+  "params": {
+    "signed_blocks_window": "100",
+    "min_signed_per_window": "0.500000000000000000",
+    "downtime_jail_duration": "600s",
+    "slash_fraction_double_sign": "0.050000000000000000",
+    "slash_fraction_downtime": "0.010000000000000000"
+  }
+}
+
+
+


+
+ GET /cosmos/slashing/v1beta1/signing_infos/{cons_address}       queries the signing info of given cons address + +Request Example: +
https://rest.thestratos.org/cosmos/slashing/v1beta1/signing_infos/stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp
+
+Response Example: +
{
+  "val_signing_info": {
+    "address": "stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp",
+    "start_height": "0",
+    "index_offset": "198",
+    "jailed_until": "1970-01-01T00:00:00Z",
+    "tombstoned": false,
+    "missed_blocks_counter": "0"
+  }
+}
+
+
+ +


+
+

Staking🔗︎

+
+ GET /cosmos/staking/v1beta1/validators       queries all validator candidates + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/validators
+
+ + +|:warning: By default it returns only the bonded validators| +|:------------------------------------| + +Response Example: +
{
+  "validators": [
+    {
+      "operator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+      "consensus_pubkey": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+      },
+      "jailed": false,
+      "status": "BOND_STATUS_BONDED",
+      "tokens": "504000000000000000000",
+      "delegator_shares": "504000000000000000000.000000000000000000",
+      "description": {
+        "moniker": "node",
+        "identity": "",
+        "website": "",
+        "security_contact": "",
+        "details": ""
+      },
+      "unbonding_height": "0",
+      "unbonding_time": "1970-01-01T00:00:00Z",
+      "commission": {
+        "commission_rates": {
+          "rate": "0.100000000000000000",
+          "max_rate": "0.200000000000000000",
+          "max_change_rate": "0.010000000000000000"
+        },
+        "update_time": "2024-03-07T14:14:09.179630523Z"
+      },
+      "min_self_delegation": "1",
+      "unbonding_on_hold_ref_count": "0",
+      "unbonding_ids": []
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+ +


+
+ GET /cosmos/staking/v1beta1/validators/{validator_addr}       queries validator info for given validator address + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs
+
+Response Example: +
{
+  "validator": {
+    "operator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+    "consensus_pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+    },
+    "jailed": false,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "504000000000000000000",
+    "delegator_shares": "504000000000000000000.000000000000000000",
+    "description": {
+      "moniker": "node",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "unbonding_height": "0",
+    "unbonding_time": "1970-01-01T00:00:00Z",
+    "commission": {
+      "commission_rates": {
+        "rate": "0.100000000000000000",
+        "max_rate": "0.200000000000000000",
+        "max_change_rate": "0.010000000000000000"
+      },
+      "update_time": "2024-03-07T14:14:09.179630523Z"
+    },
+    "min_self_delegation": "1",
+    "unbonding_on_hold_ref_count": "0",
+    "unbonding_ids": []
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/validators/{validator_addr}/delegations       queries delegate info for given validator + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/delegations
+
+Response Example: +
{
+  "delegation_responses": [
+    {
+      "delegation": {
+        "delegator_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+        "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+        "shares": "4000000000000000000.000000000000000000"
+      },
+      "balance": {
+        "denom": "wei",
+        "amount": "4000000000000000000"
+      }
+    },
+    {
+      "delegation": {
+        "delegator_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+        "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+        "shares": "500000000000000000000.000000000000000000"
+      },
+      "balance": {
+        "denom": "wei",
+        "amount": "500000000000000000000"
+      }
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "2"
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}       queries delegate info for given validator delegator pair + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/delegations/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m
+
+Response Example: +
{
+  "delegation_response": {
+    "delegation": {
+      "delegator_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+      "shares": "500000000000000000000.000000000000000000"
+    },
+    "balance": {
+      "denom": "wei",
+      "amount": "500000000000000000000"
+    }
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation       queries unbonding info for given validator delegator pair + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/delegations/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/unbonding_delegation
+
+Response Example: +
{
+  "unbond": {
+    "delegator_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+    "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+    "entries": [
+      {
+        "creation_height": "595",
+        "completion_time": "2024-03-28T22:05:03.666256743Z",
+        "initial_balance": "1000000000000000000",
+        "balance": "1000000000000000000",
+        "unbonding_id": "1",
+        "unbonding_on_hold_ref_count": "0"
+      }
+    ]
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations       queries unbonding delegations of a validator. + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/unbonding_delegations
+
+Response Example: +
{
+  "unbonding_responses": [
+    {
+      "delegator_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+      "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+      "entries": [
+        {
+          "creation_height": "595",
+          "completion_time": "2024-03-28T22:05:03.666256743Z",
+          "initial_balance": "1000000000000000000",
+          "balance": "1000000000000000000",
+          "unbonding_id": "1",
+          "unbonding_on_hold_ref_count": "0"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/delegations/{delegator_addr}       queries all delegations of a given delegator address + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/delegations/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m
+
+Response Example: +
{
+  "delegation_responses": [
+    {
+      "delegation": {
+        "delegator_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+        "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+        "shares": "500000000000000000000.000000000000000000"
+      },
+      "balance": {
+        "denom": "wei",
+        "amount": "500000000000000000000"
+      }
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+ +


+
+ GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations       queries redelegations of given address. + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st1fw6tcpku363yz6le7569wzzg84val68e9eayq7/redelegations
+
+Response Example: +
{
+    "redelegation_responses": [
+        {
+            "redelegation": {
+                "delegator_address": "string",
+                "validator_src_address": "string",
+                "validator_dst_address": "string",
+                "entries": [
+                    {
+                        "creation_height": "string",
+                        "completion_time": "2022-07-19T19:56:04.456Z",
+                        "initial_balance": "string",
+                        "shares_dst": "string"
+                    }
+                ]
+            },
+            "entries": [
+                {
+                    "redelegation_entry": {
+                        "creation_height": "string",
+                        "completion_time": "2022-07-19T19:56:04.456Z",
+                        "initial_balance": "string",
+                        "shares_dst": "string"
+                    },
+                    "balance": "string"
+                }
+            ]
+        }
+    ],
+    "pagination": {
+        "next_key": "string",
+        "total": "string"
+    }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations       queries all unbonding delegations of a given delegator address + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/unbonding_delegations
+
+Response Example: +
{
+  "unbonding_responses": [
+    {
+      "delegator_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+      "validator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+      "entries": [
+        {
+          "creation_height": "595",
+          "completion_time": "2024-03-28T22:05:03.666256743Z",
+          "initial_balance": "1000000000000000000",
+          "balance": "1000000000000000000",
+          "unbonding_id": "1",
+          "unbonding_on_hold_ref_count": "0"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+ +


+
+ GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/validators       queries all validators info for given delegator address. + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/validators
+
+Response Example: +
{
+  "validators": [
+    {
+      "operator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+      "consensus_pubkey": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+      },
+      "jailed": false,
+      "status": "BOND_STATUS_BONDED",
+      "tokens": "504000000000000000000",
+      "delegator_shares": "504000000000000000000.000000000000000000",
+      "description": {
+        "moniker": "node",
+        "identity": "",
+        "website": "",
+        "security_contact": "",
+        "details": ""
+      },
+      "unbonding_height": "0",
+      "unbonding_time": "1970-01-01T00:00:00Z",
+      "commission": {
+        "commission_rates": {
+          "rate": "0.100000000000000000",
+          "max_rate": "0.200000000000000000",
+          "max_change_rate": "0.010000000000000000"
+        },
+        "update_time": "2024-03-07T14:14:09.179630523Z"
+      },
+      "min_self_delegation": "1",
+      "unbonding_on_hold_ref_count": "0",
+      "unbonding_ids": []
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr}       queries validator info for given delegator validator pair. + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs
+
+ +Response Example: +
{
+  "validator": {
+    "operator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+    "consensus_pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+    },
+    "jailed": false,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "504000000000000000000",
+    "delegator_shares": "504000000000000000000.000000000000000000",
+    "description": {
+      "moniker": "node",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "unbonding_height": "0",
+    "unbonding_time": "1970-01-01T00:00:00Z",
+    "commission": {
+      "commission_rates": {
+        "rate": "0.100000000000000000",
+        "max_rate": "0.200000000000000000",
+        "max_change_rate": "0.010000000000000000"
+      },
+      "update_time": "2024-03-07T14:14:09.179630523Z"
+    },
+    "min_self_delegation": "1",
+    "unbonding_on_hold_ref_count": "0",
+    "unbonding_ids": []
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/pool       queries the current state of the staking pool + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/pool
+
+Response Example: +
{
+  "pool": {
+    "not_bonded_tokens": "1000000000000000000",
+    "bonded_tokens": "504000000000000000000"
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/params       queries the current staking parameter values + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/params
+
+Response Example: +
{
+  "params": {
+    "unbonding_time": "1814400s",
+    "max_validators": 100,
+    "max_entries": 7,
+    "historical_entries": 10000,
+    "bond_denom": "wei",
+    "min_commission_rate": "0.000000000000000000"
+  }
+}
+
+
+


+
+ GET /cosmos/staking/v1beta1/historical_info/{height}       queries the historical info for given height + +Request Example: +
https://rest.thestratos.org/cosmos/staking/v1beta1/historical_info/700
+
+Response Example: +
{
+  "hist": {
+    "header": {
+      "version": {
+        "block": "11",
+        "app": "0"
+      },
+      "chain_id": "testchain",
+      "height": "700",
+      "time": "2024-03-07T22:13:53.403600862Z",
+      "last_block_id": {
+        "hash": "ciQRFn0JV6YMcF5SH505JExie/8o0HHftFNGw06nbvU=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "KIlY8gHbKLbl0Yf2bPct/VURG1Fd40Cn4KK28fzzkbU="
+        }
+      },
+      "last_commit_hash": "CmoVerksnE+b6CIfEzrPjUdNa0HDkFgZPJ8b2N+ptEI=",
+      "data_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "validators_hash": "JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=",
+      "next_validators_hash": "JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=",
+      "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=",
+      "app_hash": "Ccf/psHVEHdBnxVSErJ9QF0YAxpZMefD/BeHsJnJzVE=",
+      "last_results_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "proposer_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q="
+    },
+    "valset": [
+      {
+        "operator_address": "stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs",
+        "consensus_pubkey": {
+          "@type": "/cosmos.crypto.ed25519.PubKey",
+          "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+        },
+        "jailed": false,
+        "status": "BOND_STATUS_BONDED",
+        "tokens": "504000000000000000000",
+        "delegator_shares": "504000000000000000000.000000000000000000",
+        "description": {
+          "moniker": "node",
+          "identity": "",
+          "website": "",
+          "security_contact": "",
+          "details": ""
+        },
+        "unbonding_height": "0",
+        "unbonding_time": "1970-01-01T00:00:00Z",
+        "commission": {
+          "commission_rates": {
+            "rate": "0.100000000000000000",
+            "max_rate": "0.200000000000000000",
+            "max_change_rate": "0.010000000000000000"
+          },
+          "update_time": "2024-03-07T14:14:09.179630523Z"
+        },
+        "min_self_delegation": "1",
+        "unbonding_on_hold_ref_count": "0",
+        "unbonding_ids": []
+      }
+    ]
+  }
+}
+
+
+ +


+
+

Service🔗︎

+
+ GET /cosmos/base/tendermint/v1beta1/blocks/latest       returns the latest block + +Request Example: +
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/blocks/latest
+
+Response Example: +
{
+  "block_id": {
+    "hash": "lBHIQTVmY69uPYLO2U+6Hc+WnTyxJCOg4KHEdE61cLg=",
+    "part_set_header": {
+      "total": 1,
+      "hash": "BI05Rm+Cu9tcyaD6MtcZT/TELH3usNEb06Ow6hAePGg="
+    }
+  },
+  "block": {
+    "header": {
+      "version": {
+        "block": "11",
+        "app": "0"
+      },
+      "chain_id": "testchain",
+      "height": "838",
+      "time": "2024-03-07T22:25:29.761240552Z",
+      "last_block_id": {
+        "hash": "SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E="
+        }
+      },
+      "last_commit_hash": "I11Q6Pn8ElFS6jxf2mbTg4rRUWMU0ref9ZVTodTpUPc=",
+      "data_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "validators_hash": "JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=",
+      "next_validators_hash": "JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=",
+      "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=",
+      "app_hash": "IGWGjx9a8FbYmkpNQ5z6H/r28ZIIjWx8oTaYS1Myb7s=",
+      "last_results_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "proposer_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q="
+    },
+    "data": {
+      "txs": []
+    },
+    "evidence": {
+      "evidence": []
+    },
+    "last_commit": {
+      "height": "837",
+      "round": 0,
+      "block_id": {
+        "hash": "SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E="
+        }
+      },
+      "signatures": [
+        {
+          "block_id_flag": "BLOCK_ID_FLAG_COMMIT",
+          "validator_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q=",
+          "timestamp": "2024-03-07T22:25:29.761240552Z",
+          "signature": "ocwelTOQbyvbAuWUl8D3A3lezTsAKq+Ia/VCUVhHCGa2rE9knzmUV/zXrXtyej5eCGLaHpHRWAdu9pfcPhEUCA=="
+        }
+      ]
+    }
+  },
+  "sdk_block": {
+    "header": {
+      "version": {
+        "block": "11",
+        "app": "0"
+      },
+      "chain_id": "testchain",
+      "height": "838",
+      "time": "2024-03-07T22:25:29.761240552Z",
+      "last_block_id": {
+        "hash": "SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E="
+        }
+      },
+      "last_commit_hash": "I11Q6Pn8ElFS6jxf2mbTg4rRUWMU0ref9ZVTodTpUPc=",
+      "data_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "validators_hash": "JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=",
+      "next_validators_hash": "JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=",
+      "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=",
+      "app_hash": "IGWGjx9a8FbYmkpNQ5z6H/r28ZIIjWx8oTaYS1Myb7s=",
+      "last_results_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "proposer_address": "stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp"
+    },
+    "data": {
+      "txs": []
+    },
+    "evidence": {
+      "evidence": []
+    },
+    "last_commit": {
+      "height": "837",
+      "round": 0,
+      "block_id": {
+        "hash": "SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E="
+        }
+      },
+      "signatures": [
+        {
+          "block_id_flag": "BLOCK_ID_FLAG_COMMIT",
+          "validator_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q=",
+          "timestamp": "2024-03-07T22:25:29.761240552Z",
+          "signature": "ocwelTOQbyvbAuWUl8D3A3lezTsAKq+Ia/VCUVhHCGa2rE9knzmUV/zXrXtyej5eCGLaHpHRWAdu9pfcPhEUCA=="
+        }
+      ]
+    }
+  }
+}
+
+
+


+
+ GET /cosmos/base/tendermint/v1beta1/blocks/{height}       queries block for given height + +Request Example: +
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/blocks/3
+
+ +Response Example: +
{
+  "block_id": {
+    "hash": "DXQ6q4c8WQ6u5lqCA2sOJxmoxftrzGrUv+Xham0jhNk=",
+    "part_set_header": {
+      "total": 1,
+      "hash": "mu4poLz0R4y2SHYAJNwbxioM8efNj1GPWpUsalGkxRk="
+    }
+  },
+  "block": {
+    "header": {
+      "version": {
+        "block": "11",
+        "app": "0"
+      },
+      "chain_id": "testchain",
+      "height": "3",
+      "time": "2024-03-07T21:15:18.727039882Z",
+      "last_block_id": {
+        "hash": "RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg="
+        }
+      },
+      "last_commit_hash": "7iQzSIAdehQmUybVeof1QRUU30SI4Pmg0cte+kxZMC4=",
+      "data_hash": "iA0GFiNOBJjgBeS+bRTNK0uXOAjLxRI/bLlLVfQSzh4=",
+      "validators_hash": "/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=",
+      "next_validators_hash": "/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=",
+      "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=",
+      "app_hash": "KHnseRhDsvqAjXkU2FVCUvlySordlTgGrFzkhAUjOxw=",
+      "last_results_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "proposer_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q="
+    },
+    "data": {
+      "txs": [
+        "CtgCCtUCCiUvY29zbW9zLmdvdi52MWJldGExLk1zZ1N1Ym1pdFByb3Bvc2FsEqsCCv0BCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEsoBChR1cGRhdGUgdm90aW5nIHBhcmFtcxIUdXBkYXRlIHZvdGluZyBwZXJpb2QaLwoDZ292Egx2b3RpbmdwYXJhbXMaGnsidm90aW5nX3BlcmlvZCI6ICI4NjQwMCJ9GmsKA2dvdhINZGVwb3NpdHBhcmFtcxpVeyJtaW5fZGVwb3NpdCI6IFt7ImRlbm9tIjogIndlaSIsImFtb3VudCI6ICIxMDAwMDAwIn1dLCJtYXhfZGVwb3NpdF9wZXJpb2QiOiAiODY0MDAifRopc3QxZWRwOWdrcHB4emp2Y2c5bndoZWg2dHA5cnNnYWZhdGNrZmRsNm0SdwpXCk0KJi9zdHJhdG9zLmNyeXB0by52MS5ldGhzZWNwMjU2azEuUHViS2V5EiMKIQNBlPndlLdbenThBfi5/mQPaDXY4fL0x4Vm+/PEzgiFKxIECgIIARgBEhwKFgoDd2VpEg83MTk0ODYwMDAwMDAwMDAQ/vQrGkFPkIR+nuWxlSCMABNwvragzNLy0REfuAJibSYiA05YfiDwdIYtUhgvZXvD02Kh4YbVSmVIY0IyiesiHP3884EYAA=="
+      ]
+    },
+    "evidence": {
+      "evidence": []
+    },
+    "last_commit": {
+      "height": "2",
+      "round": 0,
+      "block_id": {
+        "hash": "RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg="
+        }
+      },
+      "signatures": [
+        {
+          "block_id_flag": "BLOCK_ID_FLAG_COMMIT",
+          "validator_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q=",
+          "timestamp": "2024-03-07T21:15:18.727039882Z",
+          "signature": "QwMSz37OTLM0nBLnfg2ct7FdjZRyA8nYhi+vFRUK3Wb2boX/OiKN6r/LUxo/JxwCkhsXJWJI/HOnHV+SE6qYDA=="
+        }
+      ]
+    }
+  },
+  "sdk_block": {
+    "header": {
+      "version": {
+        "block": "11",
+        "app": "0"
+      },
+      "chain_id": "testchain",
+      "height": "3",
+      "time": "2024-03-07T21:15:18.727039882Z",
+      "last_block_id": {
+        "hash": "RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg="
+        }
+      },
+      "last_commit_hash": "7iQzSIAdehQmUybVeof1QRUU30SI4Pmg0cte+kxZMC4=",
+      "data_hash": "iA0GFiNOBJjgBeS+bRTNK0uXOAjLxRI/bLlLVfQSzh4=",
+      "validators_hash": "/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=",
+      "next_validators_hash": "/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=",
+      "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=",
+      "app_hash": "KHnseRhDsvqAjXkU2FVCUvlySordlTgGrFzkhAUjOxw=",
+      "last_results_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+      "proposer_address": "stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp"
+    },
+    "data": {
+      "txs": [
+        "CtgCCtUCCiUvY29zbW9zLmdvdi52MWJldGExLk1zZ1N1Ym1pdFByb3Bvc2FsEqsCCv0BCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEsoBChR1cGRhdGUgdm90aW5nIHBhcmFtcxIUdXBkYXRlIHZvdGluZyBwZXJpb2QaLwoDZ292Egx2b3RpbmdwYXJhbXMaGnsidm90aW5nX3BlcmlvZCI6ICI4NjQwMCJ9GmsKA2dvdhINZGVwb3NpdHBhcmFtcxpVeyJtaW5fZGVwb3NpdCI6IFt7ImRlbm9tIjogIndlaSIsImFtb3VudCI6ICIxMDAwMDAwIn1dLCJtYXhfZGVwb3NpdF9wZXJpb2QiOiAiODY0MDAifRopc3QxZWRwOWdrcHB4emp2Y2c5bndoZWg2dHA5cnNnYWZhdGNrZmRsNm0SdwpXCk0KJi9zdHJhdG9zLmNyeXB0by52MS5ldGhzZWNwMjU2azEuUHViS2V5EiMKIQNBlPndlLdbenThBfi5/mQPaDXY4fL0x4Vm+/PEzgiFKxIECgIIARgBEhwKFgoDd2VpEg83MTk0ODYwMDAwMDAwMDAQ/vQrGkFPkIR+nuWxlSCMABNwvragzNLy0REfuAJibSYiA05YfiDwdIYtUhgvZXvD02Kh4YbVSmVIY0IyiesiHP3884EYAA=="
+      ]
+    },
+    "evidence": {
+      "evidence": []
+    },
+    "last_commit": {
+      "height": "2",
+      "round": 0,
+      "block_id": {
+        "hash": "RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=",
+        "part_set_header": {
+          "total": 1,
+          "hash": "VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg="
+        }
+      },
+      "signatures": [
+        {
+          "block_id_flag": "BLOCK_ID_FLAG_COMMIT",
+          "validator_address": "BZSf7wMJCGhrNgeci+lY7kEth0Q=",
+          "timestamp": "2024-03-07T21:15:18.727039882Z",
+          "signature": "QwMSz37OTLM0nBLnfg2ct7FdjZRyA8nYhi+vFRUK3Wb2boX/OiKN6r/LUxo/JxwCkhsXJWJI/HOnHV+SE6qYDA=="
+        }
+      ]
+    }
+  }
+}
+
+
+


+
+ GET /cosmos/base/tendermint/v1beta1/node_info       queries the current node info + +Request Example: +
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/node_info
+
+ +Response Example: +
{
+  "default_node_info": {
+    "protocol_version": {
+      "p2p": "8",
+      "block": "11",
+      "app": "0"
+    },
+    "default_node_id": "173ebeb219ae7e8d53e7882063429213b9176b6f",
+    "listen_addr": "tcp://0.0.0.0:26656",
+    "network": "testchain",
+    "version": "0.37.2",
+    "channels": "QCAhIiMwOGBhAA==",
+    "moniker": "node",
+    "other": {
+      "tx_index": "on",
+      "rpc_address": "tcp://127.0.0.1:26657"
+    }
+  },
+  "application_version": {
+    "name": "stchain",
+    "app_name": "stchaind",
+    "version": "v0.12.0",
+    "git_commit": "",
+    "build_tags": "",
+    "go_version": "go version go1.21.7 linux/amd64",
+    "build_deps": [
+      {
+        "path": "cloud.google.com/go",
+        "version": "v0.110.8",
+        "sum": "h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME="
+      },
+      {
+        "path": "cloud.google.com/go/compute/metadata",
+        "version": "v0.2.3",
+        "sum": "h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY="
+      },
+      {
+        "path": "cloud.google.com/go/iam",
+        "version": "v1.1.2",
+        "sum": "h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4="
+      },
+      {
+        "path": "cloud.google.com/go/storage",
+        "version": "v1.30.1",
+        "sum": "h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM="
+      },
+      {
+        "path": "cosmossdk.io/api",
+        "version": "v0.3.1",
+        "sum": "h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE="
+      },
+      {
+        "path": "cosmossdk.io/core",
+        "version": "v0.5.1",
+        "sum": "h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI="
+      },
+      {
+        "path": "cosmossdk.io/depinject",
+        "version": "v1.0.0-alpha.4",
+        "sum": "h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc="
+      },
+      {
+        "path": "cosmossdk.io/errors",
+        "version": "v1.0.0",
+        "sum": "h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04="
+      },
+      {
+        "path": "cosmossdk.io/log",
+        "version": "v1.2.1",
+        "sum": "h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk="
+      },
+      {
+        "path": "cosmossdk.io/math",
+        "version": "v1.2.0",
+        "sum": "h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig="
+      },
+      {
+        "path": "cosmossdk.io/simapp",
+        "version": "v0.0.0-20230828070859-c9144f02dda8",
+        "sum": "h1:xQBu6b8LinrtmUkpYhCfnz9/aF1iW0BxHp7D71Z4CyI="
+      },
+      {
+        "path": "cosmossdk.io/tools/rosetta",
+        "version": "v0.2.1",
+        "sum": "h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw="
+      },
+      {
+        "path": "filippo.io/edwards25519",
+        "version": "v1.0.0",
+        "sum": "h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek="
+      },
+      {
+        "path": "github.com/99designs/keyring",
+        "version": "v1.2.1",
+        "sum": ""
+      },
+      {
+        "path": "github.com/ChainSafe/go-schnorrkel",
+        "version": "v0.0.0-20200405005733-88cbf1b4c40d",
+        "sum": "h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg="
+      },
+      {
+        "path": "github.com/Nik-U/pbc",
+        "version": "v0.0.0-20181205041846-3e516ca0c5d6",
+        "sum": "h1:GU/vL5sj0IgGYEOIIAJ1HDI9dgqT0gJXkhXINri7Otc="
+      },
+      {
+        "path": "github.com/VictoriaMetrics/fastcache",
+        "version": "v1.6.0",
+        "sum": "h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o="
+      },
+      {
+        "path": "github.com/armon/go-metrics",
+        "version": "v0.4.1",
+        "sum": "h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA="
+      },
+      {
+        "path": "github.com/aws/aws-sdk-go",
+        "version": "v1.44.203",
+        "sum": "h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U="
+      },
+      {
+        "path": "github.com/beorn7/perks",
+        "version": "v1.0.1",
+        "sum": "h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM="
+      },
+      {
+        "path": "github.com/bgentry/go-netrc",
+        "version": "v0.0.0-20140422174119-9fd32a8b3d3d",
+        "sum": "h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas="
+      },
+      {
+        "path": "github.com/bgentry/speakeasy",
+        "version": "v0.1.1-0.20220910012023-760eaf8b6816",
+        "sum": "h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s="
+      },
+      {
+        "path": "github.com/btcsuite/btcd",
+        "version": "v0.23.4",
+        "sum": "h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ="
+      },
+      {
+        "path": "github.com/btcsuite/btcd/btcec/v2",
+        "version": "v2.3.2",
+        "sum": "h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U="
+      },
+      {
+        "path": "github.com/btcsuite/btcd/btcutil",
+        "version": "v1.1.2",
+        "sum": "h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ="
+      },
+      {
+        "path": "github.com/btcsuite/btcd/chaincfg/chainhash",
+        "version": "v1.0.1",
+        "sum": "h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U="
+      },
+      {
+        "path": "github.com/cenkalti/backoff/v4",
+        "version": "v4.1.3",
+        "sum": "h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4="
+      },
+      {
+        "path": "github.com/cespare/xxhash/v2",
+        "version": "v2.2.0",
+        "sum": "h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44="
+      },
+      {
+        "path": "github.com/chzyer/readline",
+        "version": "v1.5.1",
+        "sum": "h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI="
+      },
+      {
+        "path": "github.com/cockroachdb/apd/v2",
+        "version": "v2.0.2",
+        "sum": "h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E="
+      },
+      {
+        "path": "github.com/cockroachdb/errors",
+        "version": "v1.10.0",
+        "sum": "h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU="
+      },
+      {
+        "path": "github.com/cockroachdb/logtags",
+        "version": "v0.0.0-20230118201751-21c54148d20b",
+        "sum": "h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE="
+      },
+      {
+        "path": "github.com/cockroachdb/redact",
+        "version": "v1.1.5",
+        "sum": "h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30="
+      },
+      {
+        "path": "github.com/coinbase/rosetta-sdk-go/types",
+        "version": "v1.0.0",
+        "sum": "h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA="
+      },
+      {
+        "path": "github.com/cometbft/cometbft",
+        "version": "v0.37.2",
+        "sum": ""
+      },
+      {
+        "path": "github.com/cometbft/cometbft-db",
+        "version": "v0.8.0",
+        "sum": "h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo="
+      },
+      {
+        "path": "github.com/confio/ics23/go",
+        "version": "v0.9.0",
+        "sum": "h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4="
+      },
+      {
+        "path": "github.com/cosmos/btcutil",
+        "version": "v1.0.5",
+        "sum": "h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk="
+      },
+      {
+        "path": "github.com/cosmos/cosmos-proto",
+        "version": "v1.0.0-beta.2",
+        "sum": "h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8="
+      },
+      {
+        "path": "github.com/cosmos/cosmos-sdk",
+        "version": "v0.47.5",
+        "sum": ""
+      },
+      {
+        "path": "github.com/cosmos/go-bip39",
+        "version": "v1.0.0",
+        "sum": "h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY="
+      },
+      {
+        "path": "github.com/cosmos/gogogateway",
+        "version": "v1.2.0",
+        "sum": "h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE="
+      },
+      {
+        "path": "github.com/cosmos/gogoproto",
+        "version": "v1.4.10",
+        "sum": "h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoKuI="
+      },
+      {
+        "path": "github.com/cosmos/iavl",
+        "version": "v0.20.0",
+        "sum": "h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38="
+      },
+      {
+        "path": "github.com/cosmos/ibc-go/v7",
+        "version": "v7.3.1",
+        "sum": "h1:bil1IjnHdyWDASFYKfwdRiNtFP6WK3osW7QFEAgU4I8="
+      },
+      {
+        "path": "github.com/cosmos/ics23/go",
+        "version": "v0.10.0",
+        "sum": "h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM="
+      },
+      {
+        "path": "github.com/cosmos/rosetta-sdk-go",
+        "version": "v0.10.0",
+        "sum": "h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM="
+      },
+      {
+        "path": "github.com/cpuguy83/go-md2man/v2",
+        "version": "v2.0.2",
+        "sum": "h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w="
+      },
+      {
+        "path": "github.com/creachadair/taskgroup",
+        "version": "v0.4.2",
+        "sum": "h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8="
+      },
+      {
+        "path": "github.com/davecgh/go-spew",
+        "version": "v1.1.1",
+        "sum": "h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c="
+      },
+      {
+        "path": "github.com/deckarep/golang-set",
+        "version": "v1.8.0",
+        "sum": "h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4="
+      },
+      {
+        "path": "github.com/decred/dcrd/dcrec/secp256k1/v4",
+        "version": "v4.1.0",
+        "sum": "h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4="
+      },
+      {
+        "path": "github.com/desertbit/timer",
+        "version": "v0.0.0-20180107155436-c41aec40b27f",
+        "sum": "h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I="
+      },
+      {
+        "path": "github.com/dlclark/regexp2",
+        "version": "v1.4.1-0.20201116162257-a2a8dda75c91",
+        "sum": "h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E="
+      },
+      {
+        "path": "github.com/dop251/goja",
+        "version": "v0.0.0-20220405120441-9037c2b61cbf",
+        "sum": "h1:Yt+4K30SdjOkRoRRm3vYNQgR+/ZIy0RmeUDZo7Y8zeQ="
+      },
+      {
+        "path": "github.com/dvsekhvalnov/jose2go",
+        "version": "v1.5.0",
+        "sum": "h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM="
+      },
+      {
+        "path": "github.com/edsrzf/mmap-go",
+        "version": "v1.0.0",
+        "sum": "h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw="
+      },
+      {
+        "path": "github.com/ethereum/go-ethereum",
+        "version": "v1.10.26",
+        "sum": "h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s="
+      },
+      {
+        "path": "github.com/felixge/httpsnoop",
+        "version": "v1.0.2",
+        "sum": "h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o="
+      },
+      {
+        "path": "github.com/fjl/memsize",
+        "version": "v0.0.0-20190710130421-bcb5799ab5e5",
+        "sum": "h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c="
+      },
+      {
+        "path": "github.com/fsnotify/fsnotify",
+        "version": "v1.6.0",
+        "sum": "h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY="
+      },
+      {
+        "path": "github.com/getsentry/sentry-go",
+        "version": "v0.23.0",
+        "sum": "h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE="
+      },
+      {
+        "path": "github.com/go-kit/kit",
+        "version": "v0.12.0",
+        "sum": "h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4="
+      },
+      {
+        "path": "github.com/go-kit/log",
+        "version": "v0.2.1",
+        "sum": "h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU="
+      },
+      {
+        "path": "github.com/go-logfmt/logfmt",
+        "version": "v0.6.0",
+        "sum": "h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4="
+      },
+      {
+        "path": "github.com/go-sourcemap/sourcemap",
+        "version": "v2.1.3+incompatible",
+        "sum": "h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU="
+      },
+      {
+        "path": "github.com/go-stack/stack",
+        "version": "v1.8.0",
+        "sum": "h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk="
+      },
+      {
+        "path": "github.com/godbus/dbus",
+        "version": "v0.0.0-20190726142602-4481cbc300e2",
+        "sum": "h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0="
+      },
+      {
+        "path": "github.com/gogo/googleapis",
+        "version": "v1.4.1",
+        "sum": "h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0="
+      },
+      {
+        "path": "github.com/gogo/protobuf",
+        "version": "v1.3.2",
+        "sum": "h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q="
+      },
+      {
+        "path": "github.com/golang-jwt/jwt/v4",
+        "version": "v4.3.0",
+        "sum": "h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog="
+      },
+      {
+        "path": "github.com/golang/groupcache",
+        "version": "v0.0.0-20210331224755-41bb18bfe9da",
+        "sum": "h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE="
+      },
+      {
+        "path": "github.com/golang/mock",
+        "version": "v1.6.0",
+        "sum": "h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc="
+      },
+      {
+        "path": "github.com/golang/protobuf",
+        "version": "v1.5.3",
+        "sum": "h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg="
+      },
+      {
+        "path": "github.com/golang/snappy",
+        "version": "v0.0.4",
+        "sum": "h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM="
+      },
+      {
+        "path": "github.com/google/btree",
+        "version": "v1.1.2",
+        "sum": "h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU="
+      },
+      {
+        "path": "github.com/google/go-cmp",
+        "version": "v0.5.9",
+        "sum": "h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38="
+      },
+      {
+        "path": "github.com/google/orderedcode",
+        "version": "v0.0.1",
+        "sum": "h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us="
+      },
+      {
+        "path": "github.com/google/s2a-go",
+        "version": "v0.1.4",
+        "sum": "h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc="
+      },
+      {
+        "path": "github.com/google/uuid",
+        "version": "v1.3.0",
+        "sum": "h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I="
+      },
+      {
+        "path": "github.com/googleapis/enterprise-certificate-proxy",
+        "version": "v0.2.4",
+        "sum": "h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4="
+      },
+      {
+        "path": "github.com/googleapis/gax-go/v2",
+        "version": "v2.12.0",
+        "sum": "h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas="
+      },
+      {
+        "path": "github.com/gorilla/handlers",
+        "version": "v1.5.1",
+        "sum": "h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4="
+      },
+      {
+        "path": "github.com/gorilla/mux",
+        "version": "v1.8.0",
+        "sum": "h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI="
+      },
+      {
+        "path": "github.com/gorilla/websocket",
+        "version": "v1.5.0",
+        "sum": "h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc="
+      },
+      {
+        "path": "github.com/grpc-ecosystem/go-grpc-middleware",
+        "version": "v1.3.0",
+        "sum": "h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw="
+      },
+      {
+        "path": "github.com/grpc-ecosystem/grpc-gateway",
+        "version": "v1.16.0",
+        "sum": "h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo="
+      },
+      {
+        "path": "github.com/gsterjov/go-libsecret",
+        "version": "v0.0.0-20161001094733-a6f4afe4910c",
+        "sum": "h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU="
+      },
+      {
+        "path": "github.com/gtank/merlin",
+        "version": "v0.1.1",
+        "sum": "h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is="
+      },
+      {
+        "path": "github.com/gtank/ristretto255",
+        "version": "v0.1.2",
+        "sum": "h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc="
+      },
+      {
+        "path": "github.com/hashicorp/go-bexpr",
+        "version": "v0.1.10",
+        "sum": "h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE="
+      },
+      {
+        "path": "github.com/hashicorp/go-cleanhttp",
+        "version": "v0.5.2",
+        "sum": "h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ="
+      },
+      {
+        "path": "github.com/hashicorp/go-getter",
+        "version": "v1.7.1",
+        "sum": "h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY="
+      },
+      {
+        "path": "github.com/hashicorp/go-immutable-radix",
+        "version": "v1.3.1",
+        "sum": "h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc="
+      },
+      {
+        "path": "github.com/hashicorp/go-safetemp",
+        "version": "v1.0.0",
+        "sum": "h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo="
+      },
+      {
+        "path": "github.com/hashicorp/go-version",
+        "version": "v1.6.0",
+        "sum": "h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek="
+      },
+      {
+        "path": "github.com/hashicorp/golang-lru",
+        "version": "v0.5.5-0.20210104140557-80c98217689d",
+        "sum": "h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs="
+      },
+      {
+        "path": "github.com/hashicorp/hcl",
+        "version": "v1.0.0",
+        "sum": "h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4="
+      },
+      {
+        "path": "github.com/hdevalence/ed25519consensus",
+        "version": "v0.1.0",
+        "sum": "h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU="
+      },
+      {
+        "path": "github.com/holiman/bloomfilter/v2",
+        "version": "v2.0.3",
+        "sum": "h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao="
+      },
+      {
+        "path": "github.com/holiman/uint256",
+        "version": "v1.2.0",
+        "sum": "h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM="
+      },
+      {
+        "path": "github.com/huandu/skiplist",
+        "version": "v1.2.0",
+        "sum": "h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw="
+      },
+      {
+        "path": "github.com/huin/goupnp",
+        "version": "v1.0.3",
+        "sum": "h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ="
+      },
+      {
+        "path": "github.com/improbable-eng/grpc-web",
+        "version": "v0.15.0",
+        "sum": "h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ="
+      },
+      {
+        "path": "github.com/ipfs/go-cid",
+        "version": "v0.1.0",
+        "sum": "h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0="
+      },
+      {
+        "path": "github.com/jackpal/go-nat-pmp",
+        "version": "v1.0.2",
+        "sum": "h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus="
+      },
+      {
+        "path": "github.com/jmespath/go-jmespath",
+        "version": "v0.4.0",
+        "sum": "h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg="
+      },
+      {
+        "path": "github.com/kelindar/bitmap",
+        "version": "v1.4.1",
+        "sum": "h1:Ih0BWMYXkkZxPMU536DsQKRhdvqFl7tuNjImfLJWC6E="
+      },
+      {
+        "path": "github.com/kelindar/simd",
+        "version": "v1.1.2",
+        "sum": "h1:KduKb+M9cMY2HIH8S/cdJyD+5n5EGgq+Aeeleos55To="
+      },
+      {
+        "path": "github.com/klauspost/compress",
+        "version": "v1.16.3",
+        "sum": "h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY="
+      },
+      {
+        "path": "github.com/klauspost/cpuid/v2",
+        "version": "v2.2.4",
+        "sum": "h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk="
+      },
+      {
+        "path": "github.com/kr/pretty",
+        "version": "v0.3.1",
+        "sum": "h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE="
+      },
+      {
+        "path": "github.com/kr/text",
+        "version": "v0.2.0",
+        "sum": "h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY="
+      },
+      {
+        "path": "github.com/lib/pq",
+        "version": "v1.10.7",
+        "sum": "h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw="
+      },
+      {
+        "path": "github.com/libp2p/go-buffer-pool",
+        "version": "v0.1.0",
+        "sum": "h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8="
+      },
+      {
+        "path": "github.com/magiconair/properties",
+        "version": "v1.8.7",
+        "sum": "h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY="
+      },
+      {
+        "path": "github.com/manifoldco/promptui",
+        "version": "v0.9.0",
+        "sum": "h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA="
+      },
+      {
+        "path": "github.com/mattn/go-colorable",
+        "version": "v0.1.13",
+        "sum": "h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA="
+      },
+      {
+        "path": "github.com/mattn/go-isatty",
+        "version": "v0.0.19",
+        "sum": "h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA="
+      },
+      {
+        "path": "github.com/mattn/go-runewidth",
+        "version": "v0.0.9",
+        "sum": "h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0="
+      },
+      {
+        "path": "github.com/matttproud/golang_protobuf_extensions",
+        "version": "v1.0.4",
+        "sum": "h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo="
+      },
+      {
+        "path": "github.com/mimoo/StrobeGo",
+        "version": "v0.0.0-20210601165009-122bf33a46e0",
+        "sum": "h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94="
+      },
+      {
+        "path": "github.com/minio/blake2b-simd",
+        "version": "v0.0.0-20160723061019-3f5f724cb5b1",
+        "sum": "h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g="
+      },
+      {
+        "path": "github.com/minio/highwayhash",
+        "version": "v1.0.2",
+        "sum": "h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g="
+      },
+      {
+        "path": "github.com/minio/sha256-simd",
+        "version": "v1.0.0",
+        "sum": "h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g="
+      },
+      {
+        "path": "github.com/mitchellh/go-homedir",
+        "version": "v1.1.0",
+        "sum": "h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y="
+      },
+      {
+        "path": "github.com/mitchellh/go-testing-interface",
+        "version": "v1.14.1",
+        "sum": "h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU="
+      },
+      {
+        "path": "github.com/mitchellh/mapstructure",
+        "version": "v1.5.0",
+        "sum": "h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY="
+      },
+      {
+        "path": "github.com/mitchellh/pointerstructure",
+        "version": "v1.2.0",
+        "sum": "h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A="
+      },
+      {
+        "path": "github.com/mr-tron/base58",
+        "version": "v1.2.0",
+        "sum": "h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o="
+      },
+      {
+        "path": "github.com/mtibben/percent",
+        "version": "v0.2.1",
+        "sum": "h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs="
+      },
+      {
+        "path": "github.com/multiformats/go-base32",
+        "version": "v0.0.3",
+        "sum": "h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI="
+      },
+      {
+        "path": "github.com/multiformats/go-base36",
+        "version": "v0.1.0",
+        "sum": "h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4="
+      },
+      {
+        "path": "github.com/multiformats/go-multibase",
+        "version": "v0.0.3",
+        "sum": "h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk="
+      },
+      {
+        "path": "github.com/multiformats/go-multihash",
+        "version": "v0.0.15",
+        "sum": "h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM="
+      },
+      {
+        "path": "github.com/multiformats/go-varint",
+        "version": "v0.0.6",
+        "sum": "h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY="
+      },
+      {
+        "path": "github.com/olekukonko/tablewriter",
+        "version": "v0.0.5",
+        "sum": "h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec="
+      },
+      {
+        "path": "github.com/pelletier/go-toml/v2",
+        "version": "v2.0.8",
+        "sum": "h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ="
+      },
+      {
+        "path": "github.com/pkg/errors",
+        "version": "v0.9.1",
+        "sum": "h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4="
+      },
+      {
+        "path": "github.com/pmezard/go-difflib",
+        "version": "v1.0.0",
+        "sum": "h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM="
+      },
+      {
+        "path": "github.com/prometheus/client_golang",
+        "version": "v1.17.0",
+        "sum": "h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q="
+      },
+      {
+        "path": "github.com/prometheus/client_model",
+        "version": "v0.4.1-0.20230718164431-9a2bf3000d16",
+        "sum": "h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM="
+      },
+      {
+        "path": "github.com/prometheus/common",
+        "version": "v0.44.0",
+        "sum": "h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY="
+      },
+      {
+        "path": "github.com/prometheus/procfs",
+        "version": "v0.11.1",
+        "sum": "h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI="
+      },
+      {
+        "path": "github.com/prometheus/tsdb",
+        "version": "v0.7.1",
+        "sum": "h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA="
+      },
+      {
+        "path": "github.com/rakyll/statik",
+        "version": "v0.1.7",
+        "sum": "h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ="
+      },
+      {
+        "path": "github.com/rcrowley/go-metrics",
+        "version": "v0.0.0-20201227073835-cf1acfcdf475",
+        "sum": "h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM="
+      },
+      {
+        "path": "github.com/rjeczalik/notify",
+        "version": "v0.9.1",
+        "sum": "h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE="
+      },
+      {
+        "path": "github.com/rogpeppe/go-internal",
+        "version": "v1.11.0",
+        "sum": "h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M="
+      },
+      {
+        "path": "github.com/rs/cors",
+        "version": "v1.8.3",
+        "sum": "h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo="
+      },
+      {
+        "path": "github.com/rs/zerolog",
+        "version": "v1.30.0",
+        "sum": "h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c="
+      },
+      {
+        "path": "github.com/russross/blackfriday/v2",
+        "version": "v2.1.0",
+        "sum": "h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk="
+      },
+      {
+        "path": "github.com/shirou/gopsutil",
+        "version": "v3.21.4-0.20210419000835-c7a38de76ee5+incompatible",
+        "sum": "h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU="
+      },
+      {
+        "path": "github.com/spf13/afero",
+        "version": "v1.9.5",
+        "sum": "h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM="
+      },
+      {
+        "path": "github.com/spf13/cast",
+        "version": "v1.5.1",
+        "sum": "h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA="
+      },
+      {
+        "path": "github.com/spf13/cobra",
+        "version": "v1.7.0",
+        "sum": "h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I="
+      },
+      {
+        "path": "github.com/spf13/jwalterweatherman",
+        "version": "v1.1.0",
+        "sum": "h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk="
+      },
+      {
+        "path": "github.com/spf13/pflag",
+        "version": "v1.0.5",
+        "sum": "h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA="
+      },
+      {
+        "path": "github.com/spf13/viper",
+        "version": "v1.16.0",
+        "sum": "h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc="
+      },
+      {
+        "path": "github.com/stratosnet/stratos-chain/api",
+        "version": "v0.0.0-20231220214043-682f174b1c21",
+        "sum": "h1:aVfwtoQ4dCAXbzfQ9k4rLKkT4UAeWudH8OxNb3WXQm8="
+      },
+      {
+        "path": "github.com/stretchr/testify",
+        "version": "v1.8.4",
+        "sum": "h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk="
+      },
+      {
+        "path": "github.com/subosito/gotenv",
+        "version": "v1.4.2",
+        "sum": "h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8="
+      },
+      {
+        "path": "github.com/syndtr/goleveldb",
+        "version": "v1.0.1-0.20220721030215-126854af5e6d",
+        "sum": ""
+      },
+      {
+        "path": "github.com/tendermint/go-amino",
+        "version": "v0.16.0",
+        "sum": "h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E="
+      },
+      {
+        "path": "github.com/tidwall/btree",
+        "version": "v1.6.0",
+        "sum": "h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg="
+      },
+      {
+        "path": "github.com/tklauser/go-sysconf",
+        "version": "v0.3.11",
+        "sum": "h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM="
+      },
+      {
+        "path": "github.com/tklauser/numcpus",
+        "version": "v0.6.0",
+        "sum": "h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms="
+      },
+      {
+        "path": "github.com/tyler-smith/go-bip39",
+        "version": "v1.1.0",
+        "sum": "h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8="
+      },
+      {
+        "path": "github.com/ulikunitz/xz",
+        "version": "v0.5.11",
+        "sum": "h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8="
+      },
+      {
+        "path": "github.com/urfave/cli/v2",
+        "version": "v2.10.2",
+        "sum": "h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y="
+      },
+      {
+        "path": "github.com/xrash/smetrics",
+        "version": "v0.0.0-20201216005158-039620a65673",
+        "sum": "h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU="
+      },
+      {
+        "path": "go.opencensus.io",
+        "version": "v0.24.0",
+        "sum": "h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0="
+      },
+      {
+        "path": "golang.org/x/crypto",
+        "version": "v0.12.0",
+        "sum": "h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk="
+      },
+      {
+        "path": "golang.org/x/exp",
+        "version": "v0.0.0-20230711153332-06a737ee72cb",
+        "sum": "h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us="
+      },
+      {
+        "path": "golang.org/x/net",
+        "version": "v0.14.0",
+        "sum": "h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14="
+      },
+      {
+        "path": "golang.org/x/oauth2",
+        "version": "v0.10.0",
+        "sum": "h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8="
+      },
+      {
+        "path": "golang.org/x/sync",
+        "version": "v0.3.0",
+        "sum": "h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E="
+      },
+      {
+        "path": "golang.org/x/sys",
+        "version": "v0.11.0",
+        "sum": "h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM="
+      },
+      {
+        "path": "golang.org/x/term",
+        "version": "v0.11.0",
+        "sum": "h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0="
+      },
+      {
+        "path": "golang.org/x/text",
+        "version": "v0.12.0",
+        "sum": "h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc="
+      },
+      {
+        "path": "golang.org/x/xerrors",
+        "version": "v0.0.0-20220907171357-04be3eba64a2",
+        "sum": "h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk="
+      },
+      {
+        "path": "google.golang.org/api",
+        "version": "v0.128.0",
+        "sum": "h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg="
+      },
+      {
+        "path": "google.golang.org/appengine",
+        "version": "v1.6.7",
+        "sum": "h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c="
+      },
+      {
+        "path": "google.golang.org/genproto",
+        "version": "v0.0.0-20230920204549-e6e6cdab5c13",
+        "sum": "h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0="
+      },
+      {
+        "path": "google.golang.org/genproto/googleapis/api",
+        "version": "v0.0.0-20231002182017-d307bd883b97",
+        "sum": "h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU="
+      },
+      {
+        "path": "google.golang.org/genproto/googleapis/rpc",
+        "version": "v0.0.0-20230920204549-e6e6cdab5c13",
+        "sum": "h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM="
+      },
+      {
+        "path": "google.golang.org/grpc",
+        "version": "v1.58.3",
+        "sum": "h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ="
+      },
+      {
+        "path": "google.golang.org/protobuf",
+        "version": "v1.31.0",
+        "sum": "h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8="
+      },
+      {
+        "path": "gopkg.in/ini.v1",
+        "version": "v1.67.0",
+        "sum": "h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA="
+      },
+      {
+        "path": "gopkg.in/yaml.v2",
+        "version": "v2.4.0",
+        "sum": "h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY="
+      },
+      {
+        "path": "gopkg.in/yaml.v3",
+        "version": "v3.0.1",
+        "sum": "h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA="
+      },
+      {
+        "path": "nhooyr.io/websocket",
+        "version": "v1.8.6",
+        "sum": "h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k="
+      },
+      {
+        "path": "pgregory.net/rapid",
+        "version": "v0.5.5",
+        "sum": "h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA="
+      },
+      {
+        "path": "sigs.k8s.io/yaml",
+        "version": "v1.3.0",
+        "sum": "h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo="
+      }
+    ],
+    "cosmos_sdk_version": "v0.47.5"
+  }
+}
+
+
+


+
+ GET /cosmos/base/tendermint/v1beta1/syncing       queries node syncing. + +Request Example: +
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/syncing
+
+Response Example: +
{
+  "syncing": false
+}
+
+
+


+
+ GET /cosmos/base/tendermint/v1beta1/validatorsets/latest       queries latest validator-set. + +Request Example: +
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/validatorsets/latest
+
+Response Example: +
{
+  "block_height": "927",
+  "validators": [
+    {
+      "address": "stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp",
+      "pub_key": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+      },
+      "voting_power": "504000000000000",
+      "proposer_priority": "0"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+


+
+ GET /cosmos/base/tendermint/v1beta1/validatorsets/{height}       queries validator-set at a given height. + +Request Example: +
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/validatorsets/800
+
+Response Example: +
{
+  "block_height": "800",
+  "validators": [
+    {
+      "address": "stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp",
+      "pub_key": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs="
+      },
+      "voting_power": "504000000000000",
+      "proposer_priority": "0"
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "1"
+  }
+}
+
+
+ +


+
+

Transactions🔗︎

+

Search, encode, or broadcast transactions.

+
+ GET /cosmos/tx/v1beta1/txs       fetches txs by event. + +Request Example: +
https://rest.thestratos.org/cosmos/tx/v1beta1/txs?events=tx.height=557
+
+Response Example: +
{
+  "txs": [
+    {
+      "body": {
+        "messages": [
+          {
+            "@type": "/cosmos.bank.v1beta1.MsgSend",
+            "from_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "to_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+            "amount": [
+              {
+                "denom": "wei",
+                "amount": "10000000000000000000"
+              }
+            ]
+          }
+        ],
+        "memo": "",
+        "timeout_height": "0",
+        "extension_options": [],
+        "non_critical_extension_options": []
+      },
+      "auth_info": {
+        "signer_infos": [
+          {
+            "public_key": {
+              "@type": "/stratos.crypto.v1.ethsecp256k1.PubKey",
+              "key": "A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr"
+            },
+            "mode_info": {
+              "single": {
+                "mode": "SIGN_MODE_DIRECT"
+              }
+            },
+            "sequence": "4"
+          }
+        ],
+        "fee": {
+          "amount": [
+            {
+              "denom": "wei",
+              "amount": "442524000000000"
+            }
+          ],
+          "gas_limit": "442524",
+          "payer": "",
+          "granter": ""
+        },
+        "tip": null
+      },
+      "signatures": [
+        "DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE="
+      ]
+    }
+  ],
+  "tx_responses": [
+    {
+      "height": "557",
+      "txhash": "34E401829F23098FEA1F7B398CD9842A6010249F7720BAF1916A14077C97B3E7",
+      "codespace": "",
+      "code": 0,
+      "data": "12260A242F636F736D6F732E62616E6B2E763162657461312E4D736753656E64526573706F6E7365",
+      "raw_log": "[{\"msg_index\":0,\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/cosmos.bank.v1beta1.MsgSend\"},{\"key\":\"sender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"},{\"key\":\"amount\",\"value\":\"10000000000000000000wei\"}]},{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"},{\"key\":\"amount\",\"value\":\"10000000000000000000wei\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"},{\"key\":\"sender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"},{\"key\":\"amount\",\"value\":\"10000000000000000000wei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"sender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"}]}]}]",
+      "logs": [
+        {
+          "msg_index": 0,
+          "log": "",
+          "events": [
+            {
+              "type": "message",
+              "attributes": [
+                {
+                  "key": "action",
+                  "value": "/cosmos.bank.v1beta1.MsgSend"
+                },
+                {
+                  "key": "sender",
+                  "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+                },
+                {
+                  "key": "module",
+                  "value": "bank"
+                }
+              ]
+            },
+            {
+              "type": "coin_spent",
+              "attributes": [
+                {
+                  "key": "spender",
+                  "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+                },
+                {
+                  "key": "amount",
+                  "value": "10000000000000000000wei"
+                }
+              ]
+            },
+            {
+              "type": "coin_received",
+              "attributes": [
+                {
+                  "key": "receiver",
+                  "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l"
+                },
+                {
+                  "key": "amount",
+                  "value": "10000000000000000000wei"
+                }
+              ]
+            },
+            {
+              "type": "transfer",
+              "attributes": [
+                {
+                  "key": "recipient",
+                  "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l"
+                },
+                {
+                  "key": "sender",
+                  "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+                },
+                {
+                  "key": "amount",
+                  "value": "10000000000000000000wei"
+                }
+              ]
+            },
+            {
+              "type": "message",
+              "attributes": [
+                {
+                  "key": "sender",
+                  "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "info": "",
+      "gas_wanted": "442524",
+      "gas_used": "431655",
+      "tx": {
+        "@type": "/cosmos.tx.v1beta1.Tx",
+        "body": {
+          "messages": [
+            {
+              "@type": "/cosmos.bank.v1beta1.MsgSend",
+              "from_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "to_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+              "amount": [
+                {
+                  "denom": "wei",
+                  "amount": "10000000000000000000"
+                }
+              ]
+            }
+          ],
+          "memo": "",
+          "timeout_height": "0",
+          "extension_options": [],
+          "non_critical_extension_options": []
+        },
+        "auth_info": {
+          "signer_infos": [
+            {
+              "public_key": {
+                "@type": "/stratos.crypto.v1.ethsecp256k1.PubKey",
+                "key": "A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr"
+              },
+              "mode_info": {
+                "single": {
+                  "mode": "SIGN_MODE_DIRECT"
+                }
+              },
+              "sequence": "4"
+            }
+          ],
+          "fee": {
+            "amount": [
+              {
+                "denom": "wei",
+                "amount": "442524000000000"
+              }
+            ],
+            "gas_limit": "442524",
+            "payer": "",
+            "granter": ""
+          },
+          "tip": null
+        },
+        "signatures": [
+          "DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE="
+        ]
+      },
+      "timestamp": "2024-03-07T22:01:52Z",
+      "events": [
+        {
+          "type": "coin_spent",
+          "attributes": [
+            {
+              "key": "spender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            },
+            {
+              "key": "amount",
+              "value": "442524000000000wei",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "coin_received",
+          "attributes": [
+            {
+              "key": "receiver",
+              "value": "st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q",
+              "index": true
+            },
+            {
+              "key": "amount",
+              "value": "442524000000000wei",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "transfer",
+          "attributes": [
+            {
+              "key": "recipient",
+              "value": "st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q",
+              "index": true
+            },
+            {
+              "key": "sender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            },
+            {
+              "key": "amount",
+              "value": "442524000000000wei",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "message",
+          "attributes": [
+            {
+              "key": "sender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "tx",
+          "attributes": [
+            {
+              "key": "fee",
+              "value": "442524000000000wei",
+              "index": true
+            },
+            {
+              "key": "fee_payer",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "tx",
+          "attributes": [
+            {
+              "key": "acc_seq",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m/4",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "tx",
+          "attributes": [
+            {
+              "key": "signature",
+              "value": "DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "message",
+          "attributes": [
+            {
+              "key": "action",
+              "value": "/cosmos.bank.v1beta1.MsgSend",
+              "index": true
+            },
+            {
+              "key": "sender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            },
+            {
+              "key": "module",
+              "value": "bank",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "coin_spent",
+          "attributes": [
+            {
+              "key": "spender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            },
+            {
+              "key": "amount",
+              "value": "10000000000000000000wei",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "coin_received",
+          "attributes": [
+            {
+              "key": "receiver",
+              "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+              "index": true
+            },
+            {
+              "key": "amount",
+              "value": "10000000000000000000wei",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "transfer",
+          "attributes": [
+            {
+              "key": "recipient",
+              "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+              "index": true
+            },
+            {
+              "key": "sender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            },
+            {
+              "key": "amount",
+              "value": "10000000000000000000wei",
+              "index": true
+            }
+          ]
+        },
+        {
+          "type": "message",
+          "attributes": [
+            {
+              "key": "sender",
+              "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+              "index": true
+            }
+          ]
+        }
+      ]
+    }
+  ],
+  "pagination": null,
+  "total": "1"
+}
+
+
+


+
+ GET /cosmos/tx/v1beta1/txs/{hash}       fetches a tx by hash. + +Request Example: +
https://rest.thestratos.org/cosmos/tx/v1beta1/txs/34E401829F23098FEA1F7B398CD9842A6010249F7720BAF1916A14077C97B3E7
+
+Response Example: +
{
+  "tx": {
+    "body": {
+      "messages": [
+        {
+          "@type": "/cosmos.bank.v1beta1.MsgSend",
+          "from_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+          "to_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+          "amount": [
+            {
+              "denom": "wei",
+              "amount": "10000000000000000000"
+            }
+          ]
+        }
+      ],
+      "memo": "",
+      "timeout_height": "0",
+      "extension_options": [],
+      "non_critical_extension_options": []
+    },
+    "auth_info": {
+      "signer_infos": [
+        {
+          "public_key": {
+            "@type": "/stratos.crypto.v1.ethsecp256k1.PubKey",
+            "key": "A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr"
+          },
+          "mode_info": {
+            "single": {
+              "mode": "SIGN_MODE_DIRECT"
+            }
+          },
+          "sequence": "4"
+        }
+      ],
+      "fee": {
+        "amount": [
+          {
+            "denom": "wei",
+            "amount": "442524000000000"
+          }
+        ],
+        "gas_limit": "442524",
+        "payer": "",
+        "granter": ""
+      },
+      "tip": null
+    },
+    "signatures": [
+      "DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE="
+    ]
+  },
+  "tx_response": {
+    "height": "557",
+    "txhash": "34E401829F23098FEA1F7B398CD9842A6010249F7720BAF1916A14077C97B3E7",
+    "codespace": "",
+    "code": 0,
+    "data": "12260A242F636F736D6F732E62616E6B2E763162657461312E4D736753656E64526573706F6E7365",
+    "raw_log": "[{\"msg_index\":0,\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/cosmos.bank.v1beta1.MsgSend\"},{\"key\":\"sender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"},{\"key\":\"amount\",\"value\":\"10000000000000000000wei\"}]},{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"},{\"key\":\"amount\",\"value\":\"10000000000000000000wei\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"},{\"key\":\"sender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"},{\"key\":\"amount\",\"value\":\"10000000000000000000wei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"sender\",\"value\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"}]}]}]",
+    "logs": [
+      {
+        "msg_index": 0,
+        "log": "",
+        "events": [
+          {
+            "type": "message",
+            "attributes": [
+              {
+                "key": "action",
+                "value": "/cosmos.bank.v1beta1.MsgSend"
+              },
+              {
+                "key": "sender",
+                "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+              },
+              {
+                "key": "module",
+                "value": "bank"
+              }
+            ]
+          },
+          {
+            "type": "coin_spent",
+            "attributes": [
+              {
+                "key": "spender",
+                "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+              },
+              {
+                "key": "amount",
+                "value": "10000000000000000000wei"
+              }
+            ]
+          },
+          {
+            "type": "coin_received",
+            "attributes": [
+              {
+                "key": "receiver",
+                "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l"
+              },
+              {
+                "key": "amount",
+                "value": "10000000000000000000wei"
+              }
+            ]
+          },
+          {
+            "type": "transfer",
+            "attributes": [
+              {
+                "key": "recipient",
+                "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l"
+              },
+              {
+                "key": "sender",
+                "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+              },
+              {
+                "key": "amount",
+                "value": "10000000000000000000wei"
+              }
+            ]
+          },
+          {
+            "type": "message",
+            "attributes": [
+              {
+                "key": "sender",
+                "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+              }
+            ]
+          }
+        ]
+      }
+    ],
+    "info": "",
+    "gas_wanted": "442524",
+    "gas_used": "431655",
+    "tx": {
+      "@type": "/cosmos.tx.v1beta1.Tx",
+      "body": {
+        "messages": [
+          {
+            "@type": "/cosmos.bank.v1beta1.MsgSend",
+            "from_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "to_address": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+            "amount": [
+              {
+                "denom": "wei",
+                "amount": "10000000000000000000"
+              }
+            ]
+          }
+        ],
+        "memo": "",
+        "timeout_height": "0",
+        "extension_options": [],
+        "non_critical_extension_options": []
+      },
+      "auth_info": {
+        "signer_infos": [
+          {
+            "public_key": {
+              "@type": "/stratos.crypto.v1.ethsecp256k1.PubKey",
+              "key": "A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr"
+            },
+            "mode_info": {
+              "single": {
+                "mode": "SIGN_MODE_DIRECT"
+              }
+            },
+            "sequence": "4"
+          }
+        ],
+        "fee": {
+          "amount": [
+            {
+              "denom": "wei",
+              "amount": "442524000000000"
+            }
+          ],
+          "gas_limit": "442524",
+          "payer": "",
+          "granter": ""
+        },
+        "tip": null
+      },
+      "signatures": [
+        "DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE="
+      ]
+    },
+    "timestamp": "2024-03-07T22:01:52Z",
+    "events": [
+      {
+        "type": "coin_spent",
+        "attributes": [
+          {
+            "key": "spender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          },
+          {
+            "key": "amount",
+            "value": "442524000000000wei",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "coin_received",
+        "attributes": [
+          {
+            "key": "receiver",
+            "value": "st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q",
+            "index": true
+          },
+          {
+            "key": "amount",
+            "value": "442524000000000wei",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "transfer",
+        "attributes": [
+          {
+            "key": "recipient",
+            "value": "st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q",
+            "index": true
+          },
+          {
+            "key": "sender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          },
+          {
+            "key": "amount",
+            "value": "442524000000000wei",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "message",
+        "attributes": [
+          {
+            "key": "sender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "tx",
+        "attributes": [
+          {
+            "key": "fee",
+            "value": "442524000000000wei",
+            "index": true
+          },
+          {
+            "key": "fee_payer",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "tx",
+        "attributes": [
+          {
+            "key": "acc_seq",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m/4",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "tx",
+        "attributes": [
+          {
+            "key": "signature",
+            "value": "DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "message",
+        "attributes": [
+          {
+            "key": "action",
+            "value": "/cosmos.bank.v1beta1.MsgSend",
+            "index": true
+          },
+          {
+            "key": "sender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          },
+          {
+            "key": "module",
+            "value": "bank",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "coin_spent",
+        "attributes": [
+          {
+            "key": "spender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          },
+          {
+            "key": "amount",
+            "value": "10000000000000000000wei",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "coin_received",
+        "attributes": [
+          {
+            "key": "receiver",
+            "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+            "index": true
+          },
+          {
+            "key": "amount",
+            "value": "10000000000000000000wei",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "transfer",
+        "attributes": [
+          {
+            "key": "recipient",
+            "value": "st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l",
+            "index": true
+          },
+          {
+            "key": "sender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          },
+          {
+            "key": "amount",
+            "value": "10000000000000000000wei",
+            "index": true
+          }
+        ]
+      },
+      {
+        "type": "message",
+        "attributes": [
+          {
+            "key": "sender",
+            "value": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+            "index": true
+          }
+        ]
+      }
+    ]
+  }
+}
+
+
+ +


+
+

Register🔗︎

+
+ GET /stratos/register/v1/resource_node/{nodeAddress}       queries info of a registered resource node + + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/resource_node/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv
+
+Response Example: +
{
+  "node": {
+    "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+    "pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+    },
+    "suspend": true,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "1000000000000000000",
+    "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "description": {
+      "moniker": "resource-node0",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "2024-03-08T19:18:51.591341919Z",
+    "node_type": 4,
+    "effective_tokens": "0",
+    "beneficiary_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+  }
+}
+
+
+


+
+ GET /stratos/register/v1/meta_node/{nodeAddress}       returns info of a registered meta node + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/meta_node/stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64
+
+Response Example: +
{
+  "node": {
+    "network_address": "stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64",
+    "pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ="
+    },
+    "suspend": false,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "100000000000000000000",
+    "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "description": {
+      "moniker": "snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "0001-01-01T00:00:00Z",
+    "beneficiary_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m"
+  }
+}
+
+
+


+
+ GET /stratos/register/v1/deposit_total       queries total deposit state of all registered resource nodes and meta nodes + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/deposit_total
+
+Response Example: +
{
+  "resource_nodes_total_deposit": {
+    "denom": "wei",
+    "amount": "1000000000000000000"
+  },
+  "meta_nodes_total_deposit": {
+    "denom": "wei",
+    "amount": "400000000000000000000"
+  },
+  "total_bonded_deposit": {
+    "denom": "wei",
+    "amount": "401000000000000000000"
+  },
+  "total_unbonded_deposit": {
+    "denom": "wei",
+    "amount": "0"
+  },
+  "total_unbonding_deposit": {
+    "denom": "wei",
+    "amount": "0"
+  }
+}
+
+
+


+
+ GET /stratos/register/v1/deposit_by_node/{network_addr}/{query_type}       queries deposit info of a specific node + +Request Example: + +
+ query_type      query_type defines which type of node to query for, can be one of 0 (all) | 1 (meta-node) | 2 (resource-node).
+
+ +
https://rest.thestratos.org/stratos/register/v1/deposit_by_node/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv/0
+
+Response Example: +
{
+  "deposit_info": {
+    "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+    "pubkey": {
+      "@type": "/cosmos.crypto.ed25519.PubKey",
+      "key": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+    },
+    "suspend": true,
+    "status": "BOND_STATUS_BONDED",
+    "tokens": "1000000000000000000",
+    "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+    "description": {
+      "moniker": "resource-node0",
+      "identity": "",
+      "website": "",
+      "security_contact": "",
+      "details": ""
+    },
+    "creation_time": "2024-03-08T19:18:51.591341919Z",
+    "node_type": 4,
+    "bonded_deposit": {
+      "denom": "wei",
+      "amount": "1000000000000000000"
+    },
+    "un_bonding_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    },
+    "un_bonded_deposit": {
+      "denom": "wei",
+      "amount": "0"
+    }
+  }
+}
+
+
+


+
+ GET /stratos/register/v1/deposit_by_owner/{owner_addr}       queries all deposit info of a specific owner + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/deposit_by_owner/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m
+
+Response Example: +
{
+  "deposit_infos": [
+    {
+      "network_address": "stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv",
+      "pubkey": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A="
+      },
+      "suspend": true,
+      "status": "BOND_STATUS_BONDED",
+      "tokens": "1000000000000000000",
+      "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "description": {
+        "moniker": "resource-node0",
+        "identity": "",
+        "website": "",
+        "security_contact": "",
+        "details": ""
+      },
+      "creation_time": "2024-03-08T19:18:51.591341919Z",
+      "node_type": 4,
+      "bonded_deposit": {
+        "denom": "wei",
+        "amount": "1000000000000000000"
+      },
+      "un_bonding_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      },
+      "un_bonded_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      }
+    },
+    {
+      "network_address": "stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64",
+      "pubkey": {
+        "@type": "/cosmos.crypto.ed25519.PubKey",
+        "key": "ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ="
+      },
+      "suspend": false,
+      "status": "BOND_STATUS_BONDED",
+      "tokens": "100000000000000000000",
+      "owner_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "description": {
+        "moniker": "snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888",
+        "identity": "",
+        "website": "",
+        "security_contact": "",
+        "details": ""
+      },
+      "creation_time": "0001-01-01T00:00:00Z",
+      "node_type": 0,
+      "bonded_deposit": {
+        "denom": "wei",
+        "amount": "100000000000000000000"
+      },
+      "un_bonding_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      },
+      "un_bonded_deposit": {
+        "denom": "wei",
+        "amount": "0"
+      }
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "2"
+  }
+}
+
+
+


+
+ GET /stratos/register/v1/params       queries params of registered module + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/params
+
+Response Example: +
{
+  "params": {
+    "bond_denom": "wei",
+    "unbonding_threashold_time": "15552000s",
+    "unbonding_completion_time": "1209600s",
+    "max_entries": 16,
+    "resource_node_reg_enabled": true,
+    "resource_node_min_deposit": {
+      "denom": "wei",
+      "amount": "1000000000000000000"
+    },
+    "voting_period": "604800s"
+  }
+}
+
+
+


+
+ GET /stratos/register/v1/resource_node_count       queries total number of bonded resource nodes + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/resource_node_count
+
+Response Example: +
{
+  "number": "2"
+}
+
+
+


+
+ GET /stratos/register/v1/meta_node_count       queries total number of bonded meta nodes + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/meta_node_count
+
+Response Example: +
{
+  "number": "4"
+}
+
+
+


+
+ GET /stratos/register/v1/remaining_ozone_limit       queries remaining ozone limit + +Request Example: +
https://rest.thestratos.org/stratos/register/v1/remaining_ozone_limit
+
+Response Example: +
{
+  "ozone_limit": "400000000000000"
+}
+
+
+


+
+

Proof of Traffic (PoT)🔗︎

+
+ GET /stratos/pot/v1/volume_report/{epoch}       queries Pot volume report info at a specific epoch + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/volume_report/1
+
+Response Example: +
{
+  "report_info": {
+    "epoch": "1",
+    "reference": "100A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F",
+    "tx_hash": "7F51147DB44185A1A4DC572EC0C69DEA6E9495DDCDF27CD46CA27935D4B93943",
+    "reporter": "stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64"
+  }
+}
+
+
+


+
+ GET /stratos/pot/v1/rewards/epoch/{epoch}       queries all rewards info at a specific epoch + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/rewards/epoch/1?pagination.limit=2
+
+Response Example: +
{
+  "rewards": [
+    {
+      "wallet_address": "st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax",
+      "reward_from_mining_pool": [
+        {
+          "denom": "wei",
+          "amount": "4000000000000000000"
+        }
+      ],
+      "reward_from_traffic_pool": [
+        {
+          "denom": "wei",
+          "amount": "25740279520266"
+        }
+      ]
+    },
+    {
+      "wallet_address": "st1k9hfqps9s2tpnfxch2avvevyvtry0zth39gdzc",
+      "reward_from_mining_pool": [
+        {
+          "denom": "wei",
+          "amount": "4000000000000000000"
+        }
+      ],
+      "reward_from_traffic_pool": [
+        {
+          "denom": "wei",
+          "amount": "25740279520266"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": "y0JUWCEwpMwgs3XzfSwlHBHU9Xg=",
+    "total": "0"
+  }
+}
+
+
+


+
+ GET /stratos/pot/v1/rewards/wallet/{wallet_address}       queries latest Pot rewards by beneficiary address + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/rewards/wallet/st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax
+
+Response Example: +
{
+  "rewards": {
+    "wallet_address": "st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax",
+    "mature_total_reward": [],
+    "immature_total_reward": [
+      {
+        "denom": "wei",
+        "amount": "16000257399827064713"
+      }
+    ]
+  }
+}
+
+
+


+
+ GET /stratos/pot/v1/rewards/wallet/{wallet_address}/epoch/{epoch}       queries Pot rewards info by beneficiary address at a specific epoch + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/rewards/wallet/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m/epoch/2
+
+Response Example: +
{
+  "rewards": [
+    {
+      "wallet_address": "st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m",
+      "reward_from_mining_pool": [
+        {
+          "denom": "wei",
+          "amount": "52000000000000000000"
+        }
+      ],
+      "reward_from_traffic_pool": [
+        {
+          "denom": "wei",
+          "amount": "669244695117639"
+        }
+      ]
+    }
+  ],
+  "pagination": {
+    "next_key": null,
+    "total": "0"
+  }
+}
+
+
+


+
+ GET /stratos/pot/v1/slashing/{wallet_address}       queries owner's Pot slashing info at a specific height + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/slashing/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m
+
+Response Example: +
{
+  "slashing": "0"
+}
+
+
+


+
+ GET /stratos/pot/v1/params       Query params of POT module + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/params
+
+Response Example: +
{
+  "params": {
+    "bond_denom": "wei",
+    "reward_denom": "wei",
+    "mature_epoch": "2016",
+    "mining_reward_params": [
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "0"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "16819200000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "80000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6000",
+        "meta_node_percentage_in_bp": "2000"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "16819200000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "25228800000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "40000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6200",
+        "meta_node_percentage_in_bp": "1800"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "25228800000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "29433600000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "20000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6400",
+        "meta_node_percentage_in_bp": "1600"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "29433600000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "31536000000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "10000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6600",
+        "meta_node_percentage_in_bp": "1400"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "31536000000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "32587200000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "5000000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "6800",
+        "meta_node_percentage_in_bp": "1200"
+      },
+      {
+        "total_mined_valve_start": {
+          "denom": "wei",
+          "amount": "32587200000000000000000000"
+        },
+        "total_mined_valve_end": {
+          "denom": "wei",
+          "amount": "40000000000000000000000000"
+        },
+        "mining_reward": {
+          "denom": "wei",
+          "amount": "2500000000000000000"
+        },
+        "block_chain_percentage_in_bp": "2000",
+        "resource_node_percentage_in_bp": "7000",
+        "meta_node_percentage_in_bp": "1000"
+      }
+    ],
+    "community_tax": "0.020000000000000000",
+    "initial_total_supply": {
+      "denom": "wei",
+      "amount": "100000000000000000000000000"
+    }
+  }
+}
+
+
+


+
+ GET /stratos/pot/v1/total_mined_token       queries total mined token + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/total_mined_token
+
+Response Example: +
{
+  "total_mined_token": {
+    "denom": "wei",
+    "amount": "320000000000000000000"
+  }
+}
+
+
+


+
+ GET /stratos/pot/v1/circulation_supply       queries circulation supply + +Request Example: +
https://rest.thestratos.org/stratos/pot/v1/circulation_supply
+
+Response Example: +
{
+  "circulation_supply": [
+    {
+      "denom": "wei",
+      "amount": "59999809005253057695198254"
+    }
+  ]
+}
+
+
+


+
+

SDS🔗︎

+
+ GET /stratos/sds/v1/file_upload/{file_hash}       query uploaded file info by hash + +Request Example: +
https://rest.thestratos.org/stratos/sds/v1/file_upload/v05j1m5535t62jdqc57r27gjq2nqcf0o1onavkv8
+
+Response Example: +
{
+  "file_info": {
+    "height": "235396",
+    "reporters": "DwAAAAAAAAA=",
+    "uploader": "st1f58px9ysn9zsnucqtjejakkr8lezmwggq2k6av"
+  }
+}
+
+
+


+
+ GET /stratos/sds/simPrepay/{amtToPrepay}       queries a simulated prepay result + +Request Example: +
https://rest.thestratos.org/stratos/sds/v1/sim_prepay/1stos
+
+Response Example: +
{
+  "noz": "949522847536"
+}
+
+
+


+
+ GET /stratos/sds/v1/noz_price       queries current nozPrice + +Request Example: +
https://rest.thestratos.org/stratos/sds/v1/noz_price
+
+Response Example: +
{
+  "price": "1050598.078251776812024224"
+}
+
+
+


+
+ GET /stratos/sds/v1/noz_supply       queries current nozSupply + +Request Example: +
https://rest.thestratos.org/stratos/sds/v1/noz_supply
+
+Response Example: +
{
+  "remaining": "390248902439025",
+  "total": "400000000000000"
+}
+
+
+


+
+ GET /stratos/sds/v1/params       queries params of SDS module + +Request Example: +
https://rest.thestratos.org/stratos/sds/v1/params
+
+Response Example: +
{
+  "params": {
+    "bond_denom": "wei"
+  }
+}
+
+
+


+
+ + +


+
+


+ + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/get-started/index.html b/get-started/index.html new file mode 100644 index 0000000..3a92c15 --- /dev/null +++ b/get-started/index.html @@ -0,0 +1,1834 @@ + + + + + + + + + + + + + + + + + + + + + + + Stratos Network Documentation - Stratos Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + + + + + + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +

Stratos Network Documentation

+ +
+
    +
  • +

    Stratos is a decentralized data mesh for blockchain, it defines the next generation of decentralized computing services that can serve dAPPs, allowing smart contract developers to use decentralized infrastructure to deploy, store and execute their code and data.

    +
  • +
  • +

    The core objective of Stratos is to establish a distributed network ecosystem encompassing infrastructure providers, middleware developers, and dApp creators.

    +
  • +
  • +

    This collaboration is driven by shared development, value-sharing, and efficient dedication to providing dependable, cost-effective applications, fostering the thriving landscape of blockchain applications.

    +
  • +
  • +

    Stratos is committed to creating an unassailable environment for all dApps, ensuring the durability and reliability of applications.

    +
  • +
  • +

    We will continuously update this page as new features are introduced.

    +
  • +
+
+ + +



+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Quick LinksURL
About Stratos and WhitepaperLink
UpdatesLink
HOWTO: Setup a Full-Chain nodeLink
HOWTO: Become a ValidatorLink
HOWTO: Setup a SDS Resource nodeLink
Full-Chain (Validator) node commands part 1Link
Full-Chain (Validator) node commands part 2Link
SDS Resource node commandsLink
Address Convert ToolLink
+
+



+
+

Contribution🔗︎

+

Contribution

+ +

Thank you for considering to help out with the source code! We welcome contributions +from anyone on the internet, and are grateful for even the smallest of fixes!

+

If you'd like to contribute to SDS(Stratos Decentralized Storage), please fork, fix, commit and send a pull request +for the maintainers to review and merge into the main code base.

+

Please make sure your contributions adhere to our coding guidelines:

+
    +
  • Code must adhere to the official Go formatting + guidelines (i.e. uses gofmt).
  • +
  • Code must be documented adhering to the official Go commentary + guidelines.
  • +
  • Pull requests need to be based on and opened against the dev branch, PR name should follow conventional commits.
  • +
  • Commit messages should be prefixed with the package(s) they modify. +
    e.g. "pp: make trace configs optional"
  • +
+


+
+

License🔗︎

+

License

+ +

Copyright 2023 Stratos

+

Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License.

+

Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.

+
+


+ + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ +
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..9e6e823 --- /dev/null +++ b/index.html @@ -0,0 +1,139 @@ + + + + + + + + Stratos Network - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
Official Documentation of
+

Stratos Network

+

The Next Generation of ‍‍Decentralized Data Mesh

+

+

Stratos is a decentralized data mesh for blockchain, it defines the next generation of decentralized computing services that can serve dAPPs, allowing smart contract developers to use decentralized infrastructure to deploy, store and execute their code and data.

+

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+

Learn

+

Dive deeper and explore the ins and outs of Stratos, unlocking the secrets and gaining a comprehensive understanding of its inner workings.

+
+
+ +
+
+
+

Build

+

Embark on a rewarding journey of creation and innovation as we harness the power of decentralized resources to collaboratively build something extraordinary together.

+
+
+ +
+
+
+

Supervise

+

Unlock the power of Web3 while safeguarding the network's integrity - join us in operating and mantaining a Validator and Resource Node for an empowering experience with lucrative incentives.

+
+
+ +
+
+
+ + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/js/extra.js b/js/extra.js new file mode 100644 index 0000000..00e7fac --- /dev/null +++ b/js/extra.js @@ -0,0 +1,10 @@ +// open externalLinks in new tab +function externalLinks() { + for(var c = document.getElementsByTagName("a"), a = 0;a < c.length;a++) { + var b = c[a]; + b.getAttribute("href") && b.hostname !== location.hostname && (b.target = "_blank") + } +} +; +externalLinks(); + diff --git a/js/mathjax.js b/js/mathjax.js new file mode 100644 index 0000000..10d67c0 --- /dev/null +++ b/js/mathjax.js @@ -0,0 +1,16 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.typesetPromise() +}) diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..7b635fc --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome","text":"

Stratos Network

- The Next Generation of \u200d\u200dDecentralized Data Mesh -

SDS & Stratos-chainOfficial Documentation

"},{"location":"#quick-start","title":"Quick Start","text":"Description Link About Stratos and Whitepaper Link HOWTO: Setup a Full-Chain node Link HOWTO: Become a Validator Link HOWTO: Setup a SDS Resource node Link Full-Chain (Validator) node commands part 1 Link Full-Chain (Validator) node commands part 2 Link SDS Resource node commands Link Address Convert Tool Link"},{"location":"#contribution","title":"Contribution","text":"

Thank you for considering to help out with the source code! We welcome contributions from anyone on the internet, and are grateful for even the smallest of fixes!

If you'd like to contribute to SDS(Stratos Decentralized Storage), please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base.

Please make sure your contributions adhere to our coding guidelines:

  • Code must adhere to the official Go formatting guidelines (i.e. uses gofmt).
  • Code must be documented adhering to the official Go commentary guidelines.
  • Pull requests need to be based on and opened against the dev branch, PR name should follow conventional commits.
  • Commit messages should be prefixed with the package(s) they modify. e.g. \"pp: make trace configs optional\"

"},{"location":"#license","title":"License","text":"

Copyright 2023 Stratos

Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License.

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

"},{"location":"get-started/","title":"Stratos Network Documentation","text":"
  • Stratos is a decentralized data mesh for blockchain, it defines the next generation of decentralized computing services that can serve dAPPs, allowing smart contract developers to use decentralized infrastructure to deploy, store and execute their code and data.

  • The core objective of Stratos is to establish a distributed network ecosystem encompassing infrastructure providers, middleware developers, and dApp creators.

  • This collaboration is driven by shared development, value-sharing, and efficient dedication to providing dependable, cost-effective applications, fostering the thriving landscape of blockchain applications.

  • Stratos is committed to creating an unassailable environment for all dApps, ensuring the durability and reliability of applications.

  • We will continuously update this page as new features are introduced.

"},{"location":"get-started/#quick-links","title":"Quick Links","text":"Quick Links URL About Stratos and Whitepaper Link Updates Link HOWTO: Setup a Full-Chain node Link HOWTO: Become a Validator Link HOWTO: Setup a SDS Resource node Link Full-Chain (Validator) node commands part 1 Link Full-Chain (Validator) node commands part 2 Link SDS Resource node commands Link Address Convert Tool Link"},{"location":"get-started/#contribution","title":"Contribution","text":"Contribution

Thank you for considering to help out with the source code! We welcome contributions from anyone on the internet, and are grateful for even the smallest of fixes!

If you'd like to contribute to SDS(Stratos Decentralized Storage), please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base.

Please make sure your contributions adhere to our coding guidelines:

  • Code must adhere to the official Go formatting guidelines (i.e. uses gofmt).
  • Code must be documented adhering to the official Go commentary guidelines.
  • Pull requests need to be based on and opened against the dev branch, PR name should follow conventional commits.
  • Commit messages should be prefixed with the package(s) they modify. e.g. \"pp: make trace configs optional\"

"},{"location":"get-started/#license","title":"License","text":"License

Copyright 2023 Stratos

Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License.

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

"},{"location":"docs-about/about-stratos/","title":"About Stratos Project and Whitepaper","text":""},{"location":"docs-about/about-stratos/#what-is-stratos","title":"What is Stratos ?","text":"

Stratos is a large-scale distributed infrastructure network designed to provide a comprehensive set of resources, including computation, storage, and network traffic, all in one platform. It leverages Proof-of-Traffic algorithms to reward participants and contributors based on their contributions to the network's traffic. Additionally, Stratos utilizes its own blockchain to measure the usage of computing resources, while incorporating the Practical Byzantine Fault-Tolerant consensus algorithm (PBFT) to integrate the network Proof-of-Traffic consensus algorithm deeply. This enables Stratos to provide settlement services and financial payment services for network providers and users in a highly efficient, fair, and transparent manner.

The primary goal of Stratos is to serve as a decentralized data mesh for blockchain applications. It seeks to define the next generation of decentralized computing services, catering to Dapp (Decentralized Application) developers like those working on projects such as Uniswap, AAVE, and NFT Dapps. By using Stratos, developers can deploy, store, and execute their code and data on decentralized infrastructure, thereby eliminating the need for complex network deployment. This allows developers to focus solely on their product's business logic without having to worry about the underlying infrastructure, leading to more effective development and lower costs.

In essence, Stratos aims to establish a distributed network ecosystem that brings together infrastructure providers, middleware developers, and Dapp developers. This collaborative environment encourages shared value creation and efficient cooperation to deliver credible, reliable, and cost-effective applications for the prosperity of blockchain-based solutions. One of Stratos' main promises is to offer an indestructible environment for all Dapps, ensuring that no one can take down applications hosted on the platform. This enhanced resilience and reliability foster a robust ecosystem for blockchain applications to thrive.

"},{"location":"docs-about/about-stratos/#the-meaning-of-stratos","title":"The Meaning of \u2018Stratos\u2019","text":"

The name 'Stratos' is derived from the term 'stratosphere', an atmospheric layer encircling the Earth. Positioned approximately 10 kilometers above the Earth's surface (8 kilometers at the poles) and extending up to around 50 kilometers altitude, the stratosphere embodies distinct climatic attributes. Characterized by predominantly horizontal air currents and minimal vertical air movement, it fosters atmospheric stability and lacks substantial vertical convection.

In the context of decentralized services, 'Stratos' assumes a role akin to that of the stratosphere in relation to the Earth's blockchain ecosystem. It functions as a surrounding infrastructure, furnishing decentralized storage, decentralized databases, and decentralized computing services to blockchain applications. Drawing a parallel between the two, Stratos envelops the blockchain realm, providing an analogous environment of resourceful support.

"},{"location":"docs-about/about-stratos/#the-significance-of-decentralization","title":"The Significance of Decentralization","text":"

When compared to centralization, decentralization brings forth two pivotal distinctions: Equal Rights and Data Ownership. In a decentralized framework, all participants enjoy equal rights, and data ownership rests with the creators rather than the system's proprietors. A case in point is the centralized system provided by Google, offering services such as customer support, information retrieval, online storage, and email. While ostensibly free, the true cost resides in personal data. Google exploits this data for commercial gains.

Decentralization, as exemplified by blockchain, ensures parity in rights and ownership of data. Each node within the blockchain network maintains equal rights, although nodes with greater computational prowess or those engaged in staking hold higher prospects for block generation. The blockchain's ledger data is accessible to the public; however, in stark contrast to centralized networks, sole verification authority over key data remains vested in the private key's possessor, resistant to external intervention.

An alternate perspective emerges by inquiring: Is decentralization synonymous with blockchain? This inquiry merits a nuanced technical delineation. A blockchain serves as a network where multiple nodes partake asynchronously via consensus mechanisms. Data across these nodes synchronizes within fixed time intervals, culminating in consensus. While a blockchain exemplifies an accomplished instantiation of decentralization, it certainly is not the sole solution. Some decentralized initiatives incorporate blockchain into their design despite business requirements that don't necessitate it, courting potential failure.

\"Stratos, as a decentralized infrastructure, is poised to expedite the advent of the new Era of Decentralization. Stratos aspires to emulate the significance of Bitcoin in 2010, which heralded the blockchain's ascendancy, and the impact of Ethereum's smart contracts in 2015, fostering blockchain's prosperity. Stratos is poised to become the bedrock of the Era of Decentralization, underpinning decentralized service infrastructure and enriching the blockchain landscape. Analogous to providing air, water, and sunlight to a system, Stratos cultivates a stable, flourishing, and sustainable ecosystem within the stratosphere.\"

A blockchain's system design, inaugurated with Bitcoin's advent, has been extensively validated. Varied implementations of public chains have affirmed its aptitude for provisioning public ledgers and smart contract services atop these ledgers. However, it's imperative to recognize that the blockchain's design is inapplicable to every decentralized service initiative.

Therefore, blockchain encapsulates but a fraction of decentralization's potential applications. As a provider of decentralized service infrastructure, Stratos amalgamates diverse decentralized components, transcending the limitations of a blockchain alone. Stratos stands as the quintessential infrastructure of the blockchain industry, offering a comprehensive suite of services to the entire blockchain domain, dissociated from single-chain affiliations and distinct from being a mere adjunct to a public chain ecosystem.

Since the inception of the blockchain sector in 2010, endeavors have been aimed at catalyzing its integration within traditional industries. However, as a blockchain primarily furnishes public ledger services, its impact on industries devoid of ledger-based requisites has been limited. Simultaneously, the booming token economy within the blockchain industry has led to misconceptions, causing external observers to perceive a lack of practical value in decentralized systems due to limited application in traditional industries. This perception neglects that decentralized systems' potential utility extends to these sectors, albeit current offerings inadequately address their needs.

Stratos' decentralized service infrastructure, meticulously designed and developed, is not restricted to the blockchain domain; it was envisioned to better serve centralized traditional industries. Stratos is poised to commercialize decentralized services, enhancing the infrastructure and services available to both decentralized and centralized businesses, while fostering efficiency, security, and stability in the provision of decentralized systems.

"},{"location":"docs-about/about-stratos/#stratos-past-and-present","title":"Stratos Past And Present","text":"

The Stratos Team is comprised of a group of skilled developers who have achieved excellence in their respective field. These professionals have garnered their expertise through their employment at well-known companies such as Canadian National Railways, Amazon, Expedia, Alibaba, and other reputable organizations. Each team member contributes a wealth of top-level skills in enterprise-level development.

A notable aspect of the team is its substantial representation from Mindgeek, a major Internet company that ranks among the top 10 in terms of website traffic. Throughout Stratos' CEO Bin Zhu's 7-year tenure at Mindgeek, he led the Cloud team, overseeing the creation and advancement of a data platform from its inception. This platform efficiently manages millions of data records per second and handles the processing of hundreds of billions of records daily. Globally, this data platform offers diverse data services to more than 100 million users each day. This history of establishing a comprehensive data network constitutes the cornerstone of Stratos, equipping it with the indispensable elements required to achieve substantial commercial applications right from the outset.

Leveraging a wealth of practical experience and insights derived from the Google GFS and Hadoop HDFS architectural models, the team has expanded the realm of distributed storage to encompass solutions for decentralized storage. The Stratos Decentralized Storage is equipped with an integrated high-performance storage module, exemplifying the fusion of hands-on experience and robust architectural principles.

"},{"location":"docs-about/about-stratos/#stratos-components","title":"Stratos Components","text":"

Stratos services consist of four core modules: blockchain, decentralized storage, decentralized databases, and decentralized computing. Just like Earth relies on air, water, soil, and sunlight, these four elements are crucial for creating the right conditions to foster growth. Various combinations of these modules also offer diverse decentralized services for both the blockchain and traditional industries.

Now, let's dive into the three layers: value, resource, and meta service. Picture them as levels, each with its own way of agreeing on things. The value layer uses Proof-of-Stake (PoS) agreement, the resource layer uses Proof-of-Traffic (PoT), and the meta service layer uses Proof-of-Authority (PoA).

This is an innovative solution to tackle the challenge of decentralization commonly referred to as the blockchain trilemma. Here's what each layer does:

  1. PoA is the closest to centralization. It keeps the meta service layer efficient, even when decentralized.

  2. PoS ensures the value layer is secure and strong.

  3. PoT is a fully decentralized way to agree on things. It lets the resource layer grow endlessly, so more resources can join the Stratos network.

Also, these three layers are like three types of nodes. Miners can pick the one that suits their hardware and needs to join the Stratos network.

To put it simply, Stratos has four modules spread across three layers, with different ways of agreeing. This forms a sturdy structure for the Stratos network, giving users stable, reliable, and efficient decentralized services.

"},{"location":"docs-about/about-stratos/#whitepaper","title":"Whitepaper","text":"

You can find all the technical details in the Stratos Whitepaper.

"},{"location":"docs-about/changes/","title":"Stratos Network Changes","text":""},{"location":"docs-about/changes/#sep-1-2023-updates","title":"Sep 1, 2023 Updates","text":"
+ SDS Resource Node IP Update Issues\n+ SDS Video Stream File Over Limit Issue\n+ SDS Resource Node Multi-Terminal Log Issue\n+ SDS RPC Request Time Issue\n+ SDS Memory Allocation Enhancement\n\n! This will be the final technical bi-weekly report\n! Next monthly updates will focus on business development and building the Stratos Ecosystem\n
"},{"location":"docs-about/changes/#aug-18-2023-updates","title":"Aug 18, 2023 Updates","text":"
+ Stratos Chain Desktop Wallet Update\n+ Stratos Chain Explorer Voting Power Fix\n+ Stratos Chain EVM Explorer Transaction History Fix\n+ SDS Documents Update\n+ SDS Stream File Hash Mismatch Issue Fix\n+ SDS Terminal Config Command Issue Fix\n+ New Website Design\n
"},{"location":"docs-about/changes/#aug-4-2023-updates","title":"Aug 4, 2023 Updates","text":"
+ Mesos Testnet Deployment\n+ Stratos Chain Ledger Support\n+ Stratos Chain Documents update\n+ Devnet Intensive Testing\n
"},{"location":"docs-about/changes/#jul-21-2023-updates","title":"Jul 21, 2023 Updates","text":"
+ Stratos Chain SDK update\n+ Stratos Chain Revert Special changes for Tropos\n+ SDS RPC Timeout Refactor(status checking)\n
"},{"location":"docs-about/changes/#jul-7-2023-updates","title":"Jul 7, 2023 Updates","text":"
+ SDS RPC Timeout Refactor(Uploading)\n+ SDS Resource Node Connection issue\n+ SDS Metanode Connection Issue\n
"},{"location":"docs-about/changes/#jun-22-2023-updates","title":"Jun 22, 2023 Updates","text":"
+ Stratos Chain Bridge Security Issue Fixes based on Auditing Feedback (7/7)\n+ SDS Light Node Implementation\n+ SDS Node Monitor Integration\n+ SDS Configuration Improvement\n+ SDS Video Streaming Improvement\n+ SDS SDK (file sharing)\n
"},{"location":"docs-about/changes/#may-26-2023-updates","title":"May 26, 2023 Updates","text":"
+ Stratos Chain Security Issue Fixes based on Auditing Feedback(23/24)\n+ SDS Security Issue Fixes based on Auditing Feedback(11/11)\n+ Stratos Chain Mainnet Migration Bridge(UI)\n+ SDS RPC Spam Protection Issue Fix\n+ SDS Node Status Report Issue Fix\n+ Metanode Memory Leak issue\n+ Metanode Tier Based Task Assignment(improving)\n
"},{"location":"docs-about/changes/#may-12-2023-updates","title":"May 12, 2023 Updates","text":"
+ Stratos Chain Issue Fixes based on Auditing Feedback(17/24)\n+ SDS Issue Fixes based on Auditing Feedback(9/9)\n+ Stratos Chain Docker Image\n+ Stratos Bridge Token Supply Limitation\n+ SDS Resource Node Usage Metrics Fixes\n+ SDS Resource Node Docker Image\n
"},{"location":"docs-about/changes/#apr-28-2023-updates","title":"Apr 28, 2023 Updates","text":"
+ Stratos Chain Issue Fixes based on Auditing Feedback(17/17)\n+ SDS Issue Fixes based on Auditing Feedback(9/9)\n+ SDS and Metanode Delayed Memory Release Issue\n
"},{"location":"docs-about/changes/#apr-14-2023-updates","title":"Apr 14, 2023 Updates","text":"
+ Stratos Chain Issue Fixes based on Auditing Feedback(15/17)\n+ SDS Framework Buffer Memory Allocation Improvement\n+ SDS Issue Fixes based on Auditing Feedback(1/7)\n+ Metanode Tier-Based Task Assignment(implementation)\n
"},{"location":"docs-about/changes/#mar-30-2023-updates","title":"Mar 30, 2023 Updates","text":"
+ Stratos Chain Tropos Reward TROS Conversion Tool\n+ Stratos Chain Genesis Account Migration(UI)\n+ Stratos Chain SDK Update\n+ SDS Requests Signature Improvement(download)\n+ SDS Support Uploading Folder\n+ SDS RPC Support Node Operation\n+ Metanode Transfer Task Issue Fix\n+ Metanode Tasks Signature Improvement\n+ Stratos Wallet Support Prepay Tx\n
"},{"location":"docs-about/changes/#mar-17-2023-updates","title":"Mar 17, 2023 Updates","text":"
+ Stratos Chain gRPC Update\n+ Stratos Chain Genesis Account Migration(burn contract)\n+ SDS gRPC usage update\n+ SDS API Server compatible with IPFS\n+ Relayer gRPC usage update\n+ SDS optimal Metanode selection mechanism improvement\n+ SDS Requests Signature Improvement(upload/report)\n+ Metanode Unindex File by Community Vote\n+ Metanode API for Network Metrics\n
"},{"location":"docs-about/changes/#mar-3-2023-updates","title":"Mar 3, 2023 Updates","text":"
+ Stratos Chain Legacy Encoding Update\n+ Stratos EVM Ecosystem Registration\n+ Stratos EVM Transaction Mempool Improvement\n+ SDS Node IP Lock Issue Fix\n+ SDS RPC Performance Improvement(uploading queue)\n+ SDS RPC Client Demo\n+ Ozone Supply changes based on SDS Node Tier\n
"},{"location":"docs-about/changes/#feb-2-2023-updates","title":"Feb 2, 2023 Updates","text":"
+ Stratos Chain Command Tool fixes\n+ Stratos Chain Web3 API WebSocket Refactor\n+ Stratos Chain Query Pagination improvement\n+ SDS Configuration Improvement\n+ SDS Support IPFS Migration\n+ SDS State Machine Refactor\n+ Metanode Relayer Improvement(configuration)\n
"},{"location":"docs-about/changes/#jan-20-2023-updates","title":"Jan 20, 2023 Updates","text":"
+ Stratos Chain memory leak Issue\n+ Stratos Chain Account Compatibility issue (Wallet convert)\n+ Stratos Chain Ozone Price Fixes\n+ SDS Connection Stability Issue\n+ SDS RPC Performance Enhancement(memory overflow)\n+ Tropos-5 Launch preparation\n
"},{"location":"docs-about/changes/#dec-22-2022-updates","title":"Dec 22, 2022 Updates","text":"
+ Stratos Chain Account Compatibility issue (SDS account convert, Explorer)\n+ Stratos Chain Tx Minimal Gas Price\n+ SDS Auto-Scaling Replication (scale-down test)\n+ SDS Resource Node Maintenance Request(testing)\n+ Metanode API Improvement(testing)\n
"},{"location":"docs-about/changes/#dec-8-2022-updates","title":"Dec 8, 2022 Updates","text":"
+ Stratos Chain Account Compatibility issue (Tropos reward convert)\n+ SDS Auto-Scaling Replication (scale-down implementation)\n+ SDS Suspended Node Data Transfer Mechanism(Improvement)\n+ Metanode API Improvement(Implementation)\n+ Metanode Backup Task Improvement\n
"},{"location":"docs-about/changes/#nov-25-2022-updates","title":"Nov 25, 2022 Updates","text":"
+ Stratos Chain Faucet Adapt STOS Decimal changes\n+ Stratos Chain Account Compatibility(Stratos Chain Changes)\n+ SDS Resource Node Maintenance Request(Implementation)\n+ SDS Resource Node legacy API cleanup\n+ Metanode configuration cleanup\n+ Metanode File/Slice Indexing Improvement(Implementation)\n+ Monitoring dashboard UI\n
"},{"location":"docs-about/changes/#oct-28-2022-updates","title":"Oct 28, 2022 Updates","text":"
+ Stratos Chain Token Denom Decimal Adjustment\n+ SDS Suspended Node Data Transfer Mechanism(implementation)\n+ SDS P2P Network Connection Improvement(implementation)\n+ SDS Log and Error Improvement\n+ SDS Auto-Scaling Replication(scale-up)\n
"},{"location":"docs-about/changes/#oct-13-2022-updates","title":"Oct 13, 2022 Updates","text":"
+ Stratos Desktop Wallet Update(issue fix)\n+ SDS Resource Node Monitor API update\n+ SDS Resource Node Performance Metrics API\n+ SDS Terminal log issue fix\n+ SDS Metanode panic issue fix\n
"},{"location":"docs-about/changes/#sep-30-2022-updates","title":"Sep 30, 2022 Updates","text":"
+ SDS Node Performance Tracking (data transferring speed)\n+ SDS Node Performance Tracking (disk usage)\n+ SDS RPC Deadlock Issue\n+ Metanode Tasks Schema Update\n+ Metanode Configuration Improvement\n+ File Replication Destination Selection Improvement\n+ Stratos Desktop Wallet Update(Windows)\n
"},{"location":"docs-about/changes/#sep-18-2022-updates","title":"Sep 18, 2022 Updates","text":"
+ Stratos Chain Community Tax for traffic\n+ Stratos Chain EVM support(Document)\n+ Stratos Desktop Wallet Update(Mac, Linux)\n+ SDS RPC Signature Schema improvement\n+ SDS new resources node replication task\n
"},{"location":"docs-about/changes/#sep-2-2022-updates","title":"Sep 2, 2022 Updates","text":"
+ Stratos Chain EVM support(testing)\n+ Stratos Chain Volume Report performance improvement\n+ Stratos Chain Resource Node Registering Lock\n+ SDS Uploading Destination Retry\n+ SDS Terminal Log Improvement\n
"},{"location":"docs-about/changes/#aug-18-2022-updates","title":"Aug 18, 2022 Updates","text":"
+ Metanode performance improvements (memory leaks)\n+ Monitoring dashboard (Authentication)\n+ Stratos Chain SDK mobile encoding/decoding enhancement\n+ Metanode Prometheus metrics\n+ Stratos Chain Tx missing error type\n
"},{"location":"docs-about/changes/#aug-1-2022-updates","title":"Aug 1, 2022 Updates","text":"
+ Tropos-4 Launch\n+ Stratos Chain Explorer update\n+ Stratos Chain EVM (Tx override)\n+ SDS RPC & SDK (Ozone balance)\n+ SDS Monitor Dashboard (Metrics API)\n
"},{"location":"docs-about/changes/#jul-15-2022-updates","title":"Jul 15, 2022 Updates","text":"
+ SDS RPC & SDK (File list & File sharing)\n+ Metanode adapts Stratos Chain updates\n+ Stratos Desktop Wallet update\n
"},{"location":"docs-about/changes/#jul-1-2022-updates","title":"Jul 1, 2022 Updates","text":"
+ Stratos Chain Rest/RPC Upgrade\n+ Stratos Chain Upgrade(testing)\n+ SDS RPC(downloading)\n+ SDS adapts Stratos Chain updates\n+ Metanode adapts Stratos Chain updates\n
"},{"location":"docs-about/changes/#jun-18-2022-updates","title":"Jun 18, 2022 Updates","text":"
+ Stratos Chain performance improvement\n+ SDS RPC(uploading)\n+ SDS downloading procedure improvement\n+ Metanode performance improvement(volume report)\n
"},{"location":"docs-about/changes/#jun-3-2022-updates","title":"Jun 3, 2022 Updates","text":"
+ Mobile Wallet multi-platform release processes (IOS)\n+ Metanode performance improvement(node status & tier)\n+ SDS replication procedure improvement\n
"},{"location":"docs-about/changes/#may-20-2022-updates","title":"May 20, 2022 Updates","text":"
+ SDS replication procedure improvement\n+ Metanode performance improvement\n+ SDS RPC & SDK\n+ Stratos Chain Upgrade(testing)\n+ Stratos Chain performance improvement\n+ Stratos Chain EVM support(testing)\n+ Monitoring dashboard\n
"},{"location":"docs-about/changes/#may-8-2022-updates","title":"May 8, 2022 Updates","text":"
+ SDS framework P2P communication encryption\n+ Mobile Wallet First Version\n+ Node Tier Mechanism bug fixes\n+ Meta node request frequency limiter\n
"},{"location":"docs-about/changes/#apr-23-2022-updates","title":"Apr 23, 2022 Updates","text":"
+ Metanode start procedure improvement\n+ Logging improvement\n+ Stchain-SDS relay layer improvement\n+ SDS Node Tier Mechanism\n
"},{"location":"docs-about/changes/#apr-8-2022-updates","title":"Apr 8, 2022 Updates","text":"
+ My wallet page\n+ Transaction history component\n+ Jail all the fake nodes\n+ Relayd refactoring\n+ Node status report\n
"},{"location":"docs-about/changes/#mar-25-2022-updates","title":"Mar 25, 2022 Updates","text":"
+ Video streaming API\n+ File upload/download verification\n+ Explorer sync service\n+ Log improvement\n+ Add alerting to specific processes\n
"},{"location":"docs-about/changes/#mar-10-2022-updates","title":"Mar 10, 2022 Updates","text":"
+ Incentive testnet testing\n+ PoA consensus integration testing\n+ Wallet multi-language support\n+ Node metrics\n+ Resource node suspension\n+ Wallet v0.6 updates\n+ PoT volume report\n+ Multiple bug fixes\n
"},{"location":"docs-about/changes/#feb-15-2022-updates","title":"Feb 15, 2022 Updates","text":"
+ PoA consensus testing\n+ Node status metrics\n+ File deletion testing\n+ Deployment scripts\n+ File backup\n+ Transaction detail page\n
"},{"location":"docs-about/changes/#ian-29-2022-updates","title":"Ian 29, 2022 Updates","text":"
+ Task report and store\n+ Stratos Chain devnet upgrade\n+ Stratos Decentralized Storage devnet upgrade\n+ File backup logic design\n+ File upload and download testing\n
"},{"location":"docs-about/changes/#ian-16-2022-updates","title":"Ian 16, 2022 Updates","text":"
+ Mining reward\n+ Tendermint migration\n+ Validator issues troubleshooting and fix\n+ Volume report\n+ Node monitor UI\n
"},{"location":"docs-about/changes/#dec-26-2021-updates","title":"Dec 26, 2021 Updates","text":"
+ Incentive testnet configurations\n+ Bug fixes in Stratos Wallet\n+ Stratos Chain documentation updates\n+ Health check and notifications\n+ SDS multiple bug fixes\n
"},{"location":"docs-about/changes/#dec-11-2021-updates","title":"Dec 11, 2021 Updates","text":"
+ Tropos Incentive Testnet\n+ Volume report transaction\n+ Bug fixes in Stratos Wallet\n+ Host metrics collection\n+ Stratos Blog page\n+ Faucet fixes\n+ Stratos Wallet User Guide\n
"},{"location":"docs-about/changes/#nov-25-2021-updates","title":"Nov 25, 2021 Updates","text":"
+ Stratos Wallet submission to Apple and Microsoft stores\n+ Stratos Wallet Download page\n+ Prepay module\n+ Log management with ElasticSearch\n+ Fix issues in various modules\n+ Reward and Staking token testing\n
"},{"location":"docs-about/changes/#nov-12-2021-updates","title":"Nov 12, 2021 Updates","text":"
+ SDS nodes staking\n+ Faucet migration\n+ Prepay troubleshooting\n+ Chain log management\n+ Private file upload with encryption\n
"},{"location":"docs-about/changes/#oct-28-2021-updates","title":"Oct 28, 2021 Updates","text":"
+ SDS launch test and bug fixes\n+ performance issue for explorer\n+ Chain log management\n+ SDS readme update\n
"},{"location":"docs-about/changes/#oct-15-2021-updates","title":"Oct 15, 2021 Updates","text":"
+ Documentation on multiple modules\n+ Faucet optimization\n+ Upgrade chain and SDS on devnet\n+ SDS readme update\n
"},{"location":"docs-about/changes/#sep-30-2021-updates","title":"Sep 30, 2021 Updates","text":"
+ Resource node and index node staking lock period\n+ Add the ozone limit changes\n+ SP node API framework update\n+ SDS streaming traffic records and balance checking\n+ Dependency update\n
"},{"location":"docs-about/changes/#sep-17-2021-updates","title":"Sep 17, 2021 Updates","text":"
+ Resource node and index node staking lock period\n+ Add the ozone limit changes\n+ Stratos Wallet\n+ Stratos Wallet Demo\n
"},{"location":"docs-about/changes/#sep-3-2021-updates","title":"Sep 3, 2021 Updates","text":"
+ REST APIs for SDS related modules\n+ SDS devnet setup\n+ Integrate updated SDK to wallet\n+ SDS Video Streaming Demo\n
"},{"location":"docs-about/changes/#aug-20-2021-updates","title":"Aug 20, 2021 Updates","text":"
+ SDS network ID standardization\n+ Stratos Chain SDS module unit test cases\n+ Ozone Supply & Price API\n+ Stratos Chain Wallet transaction fee dynamic calculation\n
"},{"location":"docs-about/changes/#aug-6-2021-updates","title":"Aug 6, 2021 Updates","text":"
+ Resource Node Information update\n+ Index Node Information update\n+ Readme documentation\n+ File Replication workflow\n+ SDS Ozone record verification\n
"},{"location":"docs-about/changes/#jul-23-2021-updates","title":"Jul 23, 2021 Updates","text":"
+ Stratos Chain load testing\n+ Stratos Chain module simulation testing\n+ SDS video streaming\n+ SDS P2P key\n
"},{"location":"docs-about/changes/#jul-9-2021-updates","title":"Jul 9, 2021 Updates","text":"
+ Stratos Chain Governance Module\n+ STOS Token unit and Ozone unit\n+ PoT reward distribution\n+ Stratos Chain Testnet infrastructure\n+ SDS relay transactions\n
"},{"location":"docs-about/changes/#jun-26-2021-updates","title":"Jun 26, 2021 Updates","text":"
+ SDS nodes query on Stratos Chain\n+ Explorer Update\n+ SDS Traffic Records\n+ SDS Traffic Aggregation\n+ Upgrade Module\n
"},{"location":"docs-about/changes/#jun-11-2021-updates","title":"Jun 11, 2021 Updates","text":"
+ PoT Reward distribution Module\n+ PoT traffic report transaction update\n+ File upload transaction update\n+ STOS unit conversion\n+ Prepay module\n+ SDS Network ID standardization\n+ Key storage on wallet\n
"},{"location":"docs-about/changes/#jun-4-2021-updates","title":"Jun 4, 2021 Updates","text":"
+ SDS file upload slice\n+ SDS file download slice\n+ SDS Relay Module to communicate with Stratos Chain\n+ We have done the first version of Performance Testing for Stratos Chain with acceptable results.\n+ Stratos Chain prepay module\n+ SDK Txs Creation\n+ SDK Txs Signing\n
"},{"location":"docs-about/changes/#may-19-2021-updates","title":"May 19, 2021 Updates","text":"
+ New Website Launch\n+ SC faucet for testnet\n+ Resource Network node registration type(for future Stratos Decentralized Database and Computation) support on SC\n+ SC genesis preparation and export\n+ SDS Relay Module\n
"},{"location":"docs-about/changes/#may-11-2021-updates","title":"May 11, 2021 Updates","text":"
+ SDS node registration module on Stratos Chain(SC)\n+ SDS Payment module on Stratos Chain\n+ SDS reward report msg on Stratos Chain\n+ SDS account validation\n+ SDS Traffic capacity Storage\n+ SDK key management\n+ Master key generation\n+ Mnemonic word\n+ HD key deviation\n+ Signing and signature verification\n
"},{"location":"docs-about/changes/#apr-19-2021-updates","title":"Apr 19, 2021 Updates","text":"
+ Stratos Chain ledger functionalities\n+ SDS node task pool\n+ SDS file upload/ file download event handling\n+ SDS File Upload transaction for Value Network to persist file hash for later validation\n+ Stratos SDK framework\n
"},{"location":"docs-about/stratos-token-economy/","title":"STOS Token Economy","text":""},{"location":"docs-about/stratos-token-economy/#abstract","title":"Abstract","text":"

Stratos, as the next generation of Decentralized Data Mesh, heavily rely on community participation to maintain self-sustainability. We propose here a Troposphere Economy Model which revolves around: 1) Resource/Meta Node miners, 2) End users, 3) Blockchain participants to achieve its business value.

All aspects are maintained through the use of Stratos Tokens (STOS). The former corresponds to the supply side and provides storage, database, and computing resources to receive incentives. The middle corresponds to the demand side, which consumes the related services, and pays fees to the Stratos network. The latter corresponds to the ledger layer who distributes the incentives based on the workload of the resource miners, facilitates transfer, etc. We tune the relationship between different stakeholders with three consensus protocols, including Proof-of-Traffic, Proof-of-Stake and Proof-of-Authority, to incentivize the stable growth of the ecosystem.

"},{"location":"docs-about/stratos-token-economy/#terminology","title":"Terminology","text":"
  • Stratos Chain (SC): The Stratos blockchain facilitates all decentralized ledger transactions and functionalities.

  • Validator node: A validator is a node that participates in the Stratos Chain block generation by voting. To become a validator, the node owner needs to self-delegate a certain amount of STOS tokens.

  • Blockchain node: All nodes that participate in the Stratos Chain.

  • Follower node: A node that participates in the Stratos Chain as a blockchain node, but does not work as a validator.

  • Stratos Decentralized Storage (SDS): A file based decentralized storage system.

  • Stratos Decentralized Database (SDD): A tree based decentralized database system.

  • Stratos Decentralized Computation (SDC): A Trusted Execution Environment based decentralized computation system.

  • Value Network: The Stratos Chain, the network that circulates all values in the Stratos Ecosystem. Resource Network: Includes Decentralized Storage, Decentralized Database and Decentralized Computation

  • Resource Node: Nodes that participate in the Stratos Resource Network by providing their disk/bandwidth/computation power to earn rewards in the Proof-of-Traffic model.

  • Meta Node: Nodes that manage the tasks in the Resource Network between all Resource Nodes. Used for indexing all content, auditing the traffic report and communicating between Resource Network and Value Network through a relay mechanism.

  • Active Resource Node: A Resource Node that has finished the activation process by depositing to the Value Network and registering to a Meta Node, and currently receives tasks assigned by the Meta Node.

  • Suspended Resource Node: A Resource Node that has not satisfied the performance KPI evaluation criteria and is suspended from receiving further tasks from the Meta Node.

  • Gas: Stratos Chain transactions consume gas to be committed in blocks. The gas is used to avoid transaction spamming.

  • Traffic: The data volume evaluated in the Resource Network. The incentive for all participants in the Stratos Ecosystem will be based on the traffic.

  • Stratos Tokens (STOS): Stratos Tokens, the native token facilitating value circulation in the Stratos Ecosystem.

  • Ozone(Oz): The traffic unit in the ecosystem.

  • Epoch: The Proof-of-Traffic evaluation periodic window. The traffic for the Resource Network is evaluated at the end of each epoch.

  • Volume Pool: The collective pool of all prepay.

  • Mining Pool: The reserved STOS to incentivize the public to participate in the network in the early stage.

"},{"location":"docs-about/stratos-token-economy/#1-system-economic-income","title":"1. System Economic Income","text":"

After launching the Stratos Data Mesh V1 (Storage), V2 (database), and V3 (computation), each module will generate corresponding economic income. The whole Stratos economy is based on a Proof-of-Traffic model that evaluates the traffic generated by users' actions. Settlement and payment of the traffic is conducted in the form of Stratos Tokens through the Stratos Blockchain. The traffic price changes dynamically based on a constant product formula.

"},{"location":"docs-about/stratos-token-economy/#-purchased-ozone","title":"- Purchased Ozone","text":"

If any user wants to use the Stratos Resource Network, he needs to prepay on the Stratos blockchain by sending a PREPAY transaction. The PREPAY transaction will let this user buy the traffic(Ozone) at a marginal price at the time \\(\\mathbf{t}\\) computed by dividing the sum of the effective genesis deposit and the current unissued prepay volume pool by the remaining total Ozone limit.

\\[ \\operatorname{price}_{t}^{o z}=\\frac{s_{t}+p_{t}}{l_{t}} \\]

The remaining total Ozone limit \\(l_{t}\\) is the upper bound of the total Ozone that users can purchase from the Stratos blockchain.

\\(S_{t}\\) is the effective total deposit by all Resource Nodes and Meta Nodes at time \\(\\mathrm{t}, l_{0}\\) is set to an amount based on the effective total deposit to reflect the STOS market price and the total SDS resources at the mainnet launch time.

The current unissued prepay Volume Pool \\(p_{t}\\) is the total remaining prepay STOS kept by the Stratos Network but not yet issued to Resource Nodes as rewards. At time \\(\\mathrm{t}=0, p_{t}=0\\)

If one user PREPAYS a total amount of \\(x\\) STOS token at time \\(t\\), then he will get the following Ozone amount if there is no slippage:

\\[ d l_{t}=\\frac{d x}{\\text { price }_{t}^{o z}}=\\frac{l_{t}}{s_{t}+p_{t}} \\times d x \\]

Where \\(d x\\) is the derived \\(x\\) that is small enough to not make the price change. Because the constant product formula guarantees that the product of available STOS and Ozone is constant.

\\[ \\text { constant }=\\left(s_{t}+p_{t}\\right) \\times\\left(l_{t}\\right)=\\left(s_{t+d t}+p_{t+d t}\\right) \\times\\left(l_{t+d t}\\right) \\]

Where \\(p_{t+d t}=p_{t}+X\\), so we can calculate the total amount of Ozone the user gets as:

\\[ \\Delta l=l_{t}-l_{t+d t}=\\frac{l_{t} \\times X}{s_{t}+p_{t}+X} \\]

And the new price of Ozone will become:

\\[ \\operatorname{price}_{t+d t}^{o z}=\\frac{s_{t}+p_{t}+X}{l_{t}-\\Delta l} \\]"},{"location":"docs-about/stratos-token-economy/#-consumed-ozone-converted-to-traffic-rewards","title":"- Consumed Ozone converted to Traffic Rewards","text":"

Users can utilize all services provided by the Resource Network by consuming Ozone. At the end of each epoch the total amount of consumed Ozone will be sold back to the Volume Pool to generate the traffic rewards to issue to all Resource Nodes:

\\[ \\operatorname{price}_{t}^{o z}=\\frac{s_{t}+p_{t}}{l_{t}} \\]

If the total consumed Ozone in an epoch is \\(Y\\), it will generate traffic rewards as:

\\[ d R=d y \\times \\frac{s_{t}+p_{t}}{l_{t}} \\]

Where \\(d y\\) is the derived \\(Y\\) that is small enough to not make the price change. Since the constant product formula guarantees:

\\[ \\text { constant }=\\left(s_{t}+p_{t}\\right) \\times\\left(l_{t}\\right)=\\left(s_{t+d t}+p_{t+d t}\\right) \\times\\left(l_{t+d t}\\right) \\]

We can calculate the total generated traffic rewards based on the total consumed Ozone \\(Y\\) as:

\\[ R=p_{t}-p_{t+d t}=\\frac{\\left(s_{t}+p_{t}\\right) \\times Y}{l_{t}+Y} \\]

Thus at the end of epoch timet \\(+d t\\), the Ozone price will become:

\\[ \\operatorname{price}_{t+d t}^{o z}=\\frac{s_{t}+p_{t}-R}{l_{t}+Y} \\]

As people keep buying Ozone without consuming it, the price of Ozone will keep increasing compared to STOS.

"},{"location":"docs-about/stratos-token-economy/#2-income-and-mining-incentive-distribution","title":"2. Income and Mining incentive distribution","text":"

The traffic reward \\(R\\) is distributed to

1) Resource Node miners(60%)

2) Meta Node miners(20%)

3) Blockchain participants(20%).

The detailed distribution plan is described in section 3, 4 and 5.

The Stratos Foundation has reserved 40% of the 100M total STOS supply as a mining rewards pool. The mining rewards are issued at the end of each epoch, with the same schedule as traffic rewards. The mining reward for each epoch will be 80 STOS, until the total issued amount reaches 16819200 STOS which will be achieved in roughly 4 years. Then the mining rewards will be halved, which makes the mining rewards become 40 STOS. Once the mining rewards are halved, the Meta Node share will be decreased by 2%, and this 2% will be added to Resource Node miners. The halving continues roughly every 4 years, for 5 times. Then the mining rewards will be 2.5 STOS until full issuance of 39M STOS. The full mining rewards pool will last roughly 68.8 years. We will allocate the rest 1M STOS for incentive testnet.

Total Mined Mining reward (per epoch) Years Resource/Meta Node/Blockchain Percentage 0 - 16,819,200 80 0-4 60% / 20% / 20% 16,819,200 - 25,228,800 40 4-8 62% / 18% / 20% 25,228,800 - 29,433,600 20 8-12 64% / 16% / 20% 29,433,600 - 31,536,000 10 12-16 66% / 14% / 20% 31,536,000 - 32,587,200 5 16-20 68% / 12% / 20% 32,587,200 - 39,000,000 2.5 20-68.8 70% / 10% / 20%

All traffic rewards and mining rewards will have a lock-up period of 14 days. An Active Resource Node needs to send a transaction to unregister from the Stratos blockchain when it wants to exit, and it can only shutdown after the 14-day cooling-off period. If the requirements are not met, the locked reward will be fully canceled and returned back to the pool.

All the Transaction gas fees that are collected in the blockchain will only be distributed to blockchain participants, based on validator nodes self-delegation and delegators delegation. It will not be given to Resource Nodes and Meta Nodes.

"},{"location":"docs-about/stratos-token-economy/#3-proof-of-traffic-mechanism","title":"3. Proof-of-Traffic Mechanism","text":"

Based on the traffic(Ozone) consumed by the whole network, Stratos will issue traffic rewards and mining rewards to participants. In this section, we only talk about the 60% share given to Resource Nodes(the percentage increases as the mining rewards keep halving).

1 Ozone can be considered as: 1GB1 data traffic in SDS or 1 million record touches1 in SDD.

"},{"location":"docs-about/stratos-token-economy/#-user-charges","title":"- User charges","text":"

All charged user traffic will be deducted from user's available Ozone balance.

  • Upload:

Uploading data will consume two parts of traffic, the initial uploading and the replication. The SDS is set to replicate 3 copies by default, which means that by uploading a file of 10MB to SDS, the user will consume 30MB of traffic. Users can configure a higher initial replica number, which will increase the number of replicas while uploading, thus consuming more traffic.

  • Download:

Downloading data will consume the total traffic actually generated by this action. If higher download requests for one copy of data triggers the automatic replicas incrementing, users will not be charged for that traffic, but only for the traffic for the final delivery.

  • Database Query:

Database Queries will consume two parts of traffic, the final delivery and the record touches.

  • Computation:

Computation is very complicated, it deserves a standalone paper to cover the calculation.

"},{"location":"docs-about/stratos-token-economy/#-resource-node-traffic-record","title":"- Resource Node traffic record","text":"

When a user triggers an action of UPLOAD/DOWNLOAD/QUERY/etc, the Meta Node will randomly assign the task to one/multiple Resource Node(s) which has enough resources(data, storage, and bandwidth) to facilitate this action. The assignment chance for each node is based on their weight maintained by Meta Node. The weight is adjusted by Meta Node based on the performance for the tasks fulfilled by the node. The initial weight for each node is determined by node's initial deposit which is discussed in section 4.

Once a Resource Node has completed the task, the traffic generated by this task is recorded as traffic contribution for this Resource Node.

"},{"location":"docs-about/stratos-token-economy/#-resource-node-settlement","title":"- Resource Node settlement","text":"

At the end of every 10 minutes epoch, Meta Nodes settle the traffic with Resource Nodes. The Resource Nodes that provide the top 80% of total traffic will be eligible to settle to get the traffic and mining rewards. Their traffic contribution will be set back to zero once settled. The unsettled traffic will accumulate to the next epoch.

Let's take SDS as an example during the first 4 years. Suppose that during one epoch, there are 5 Resource Node miners in the SDS network, respectively providing 500GB, 300GB, 200GB, 80GB, 20GB of traffic contribution. That's equivalent to 1100oz, but only the top 3 nodes will be eligible to get settled because \\(80 \\% * 1100=880\\). Thus 1000 oz is settled in the epoch. The total traffic and mining rewards of this epoch is:

\\[ R=1000 \\times \\frac{s_{t}+p_{t}}{l_{t}+1000}+80 \\]

It's safe to assume that \\(\\frac{s_{t}+p_{t}}{l_{t}+1000}=1 / 50\\) which makes the total rewards 100STOS. 60%(60 STOS) will be issued to the Resource Nodes that have been settled. The top 3 nodes will get 30STOS, 18STOS and 12STOS respectively.

"},{"location":"docs-about/stratos-token-economy/#4-proof-of-authority-mechanism","title":"4. Proof-of-Authority Mechanism","text":""},{"location":"docs-about/stratos-token-economy/#-meta-node-registration","title":"- Meta Node Registration","text":"

Stratos Foundation will verify the Meta Node operator and then there will be a vote by all existing Meta Nodes. The verification includes but is not limited to: Meta Node machine specs, internet specs, server location, security and operation management. Meta Nodes that pass this verification will need to deposit a certain amount of STOS with a registration transaction on the Stratos Blockchain. All existing Meta Nodes will need to vote to approve the registration of the new node.

"},{"location":"docs-about/stratos-token-economy/#-resource-node-activation","title":"- Resource Node Activation","text":"

Anyone can launch a Resource Node, however it will not receive any tasks from Meta Nodes until it completes the activation process. Resource Node owners need to deposit a certain amount of STOS tokens by sending an activation transaction to the Stratos Blockchain. Once this is done, the Meta Nodes will start to treat it as an active Resource Node. All the deposit STOS will be locked for at least 180 days.

"},{"location":"docs-about/stratos-token-economy/#-deposit-increase-total-ozone-limit","title":"- Deposit increase total Ozone limit","text":"

Once a new Meta Node or Resource Node deposits Z STOS for registration/activation, the remaining total Ozone limit will be increased by an amount calculated by:

\\[ \\Delta l_{t}=\\frac{Z}{r_{0}} \\]

Where \\(r_{0}\\) refers to the fixed deposit/ozone ratio. Then the new Ozone price will become:

\\[ \\operatorname{price}_{t+d t}^{o z}=\\frac{s_{t}+p_{t}}{l_{t}+\\Delta l_{t}} \\]

As more Resource Nodes are added to the network, the Ozone price will decrease compared to the STOS price.

The increased Ozone limit \\(\\Delta l_{t}\\) for a Resource Node deposit will be evaluated by the Meta Nodes as the initial Resource Node weight in task assignment. This weight will be affected later based on the Resource Node performance. We can consider that the deposit is the self claimed machine power of the Resource Node. So the owner should consider depositing more STOS if he owns a more powerful Resource Node machine. The \\(\\Delta l\\) to weight calculation equation can only be determined by incentive testnet testing results.

"},{"location":"docs-about/stratos-token-economy/#-resource-node-deactivation","title":"- Resource Node Deactivation","text":"

If a Resource Node follows the process of deactivation by sending a unregister transaction to stratos blockchain, the remaining total Ozone limit will be decreased by an amount calculated by:

\\[ \\Delta l_{t}=\\frac{Z}{r_{0}} \\]

Where \\(Z\\) is the initial deposit of this Resource Node before any slashing/fee is applied. Once a Resource Node has deactivated, the Ozone price will increase.

The Resource Node can get his deposit STOS back 14 days after deactivation if the locked 180 days period has passed or 14 + remaining days from the 180 days lock period.

Example: if a Resource Node deposits 1000 STOS to activate on day 1 of the year, and deactivate on day 150 of the year, he can only get his deposit back on day 194 of the year. Or if the node deactivates on day 190 of the year, he can only get his deposit back on day 204 of the year.

The Resource Node will also cover the data replica migration traffic fees with his unvested reward and deposit, since the whole network will consume resources to properly backup the data held by the quitting resource node. The traffic is charged the same way as user upload/download.

"},{"location":"docs-about/stratos-token-economy/#-meta-node-incentive","title":"- Meta Node Incentive","text":"

Meta Nodes will participate in all data indexing, task distribution and settlement of traffic with Resource Nodes. All Meta Nodes will equally share 20% of the total traffic rewards and mining rewards for each epoch. Given the example in section 3, all Meta Nodes would share the 20 STOS tokens.

"},{"location":"docs-about/stratos-token-economy/#5-proof-of-stake-mechanism","title":"5. Proof-of-Stake Mechanism","text":"

Stratos extended the Delegated Proof-of-Stake into Hybrid Delegated Proof-of-Stake. 20% of the total traffic and mining rewards will be allocated as stake rewards to the Proof-of-Stake beneficiaries, which include:

  1. Validators self-delegate
  2. Delegators delegate

The share of stake rewards for Validators and Delegators will be distributed based on their delegation with a configured commission for validators. The transaction gas fees mentioned in section 2 will also follow the same distribution mechanism.

Let us take an example where we have 10 validators with equal voting power and a commission rate of \\(1 \\%\\). Let us also assume that the gas fee reward for a block or the stake rewards of an epoch is 1000 STOS in total for 10 validators and that each validator has 20% of self-delegated STOS. These tokens do not go directly to the block proposer. Instead, they are evenly spread among validators. So now each validator's pool has 100 STOS. These 100 STOS will be distributed according to each participant's stake, for each validator:

Commission: 100 * 80% * 1% = 0.8 STOS

Validator get: 100 * 20% + Commission = 20.8 STOS

All delegators get: 100 * 80% - Commission = 79.2 STOS

"},{"location":"docs-about/stratos-token-economy/#6-summary","title":"6. Summary","text":"

We have achieved several key features:

  1. As more people prepay to utilize the services provided by the Resource Network, Ozone price will increase which reflects the increasing demand.

  2. As more people become Resource Nodes, the Ozone limit will increase which reflects the increasing supply, and Ozone price will decrease because of that.

  3. Ozone is the measurement of all activities in the Resource Network.

  4. STOS is the value circulating in the Stratos Ecosystem.

With all the aspects above, the Stratos Ecosystem guarantees a stable and healthy growth.

"},{"location":"docs-about/stratos-token-economy/#disclaimer","title":"Disclaimer","text":"

This paper is for general information purposes only. It does not constitute investment advice or a recommendation or solicitation to buy or sell any investment and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice or investment recommendations. This paper reflects current opinions of the authors. The opinions reflected herein are subject to change without being updated.

  1. Subject to be changed before mainnet.\u00a0\u21a9\u21a9

"},{"location":"docs-about/stratos-token-metrics/","title":"STOS Token Metrics","text":""},{"location":"docs-about/stratos-token-metrics/#stos-token-utilities","title":"STOS token utilities","text":"
  • STOS will be staked/delegated to validators to secure the Blockchain network.
  • STOS will be issued as Proof-of-Traffic mining reward.
  • STOS will be consumed in the payment of the transaction fee.
  • STOS will be prepaid for Stratos Resource Network service traffic fee.
"},{"location":"docs-about/stratos-token-metrics/#at-a-glance","title":"At a Glance","text":"

Token Ticker: STOS

Total Supply: 100,000,000

Initial Liquid Tokens: 8,125,000

Initial Market Price: 0.3 USD

"},{"location":"docs-about/stratos-token-metrics/#token-allocation-by-percent","title":"Token Allocation by Percent","text":"

Our total strategic sale (consisting of 1 seed and 2 private sale rounds) is 20% of all our tokens. The initial sale will be used for our technology development, community building, partnerships, and marketing to build out Stratos Decentralized Data Mesh.

"},{"location":"docs-about/stratos-token-metrics/#token-unlock-and-vesting-schedule","title":"Token Unlock and Vesting Schedule","text":"

Seed: 25% unlocked at TGE1. Quarterly vesting over 9 months.

Private Sale 1: 25% unlocked at TGE1. Quarterly vesting over 9 months.

Private Sale 2: 30% unlocked at TGE1, Quarterly vesting over 9 months.

Public: 100% unlocked at TGE1.

Team: 10% unlocked at day 270. Quarterly vesting over 12 months.

Ecosystem Development & Partnerships: 10% unlocked at TGE1. Remaining utilized when partnerships are established.

Liquidity Provision Fund: 30% unlocked at TGE1. Remaining utilized for new exchange listing relationships.

Foundation Reserve: 10% unlocked at day 360. Remaining quarterly vesting over 12 months.

  1. Token Generation Event was on June 09, 2021\u00a0\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9

"},{"location":"docs-evm/available-dapps/","title":"Available dapps","text":""},{"location":"docs-evm/available-dapps/#list-of-available-dapps","title":"List of available Dapps:","text":""},{"location":"docs-evm/node-config/","title":"Node config","text":""},{"location":"docs-evm/node-config/#node-configuration-to-enable-evm","title":"Node configuration to enable EVM","text":"

In order to enable EVM feature on stratos chain node (fullnode/validator), edit your <path_to_your_node>/config/app.toml with the following:

[json-rpc]\n\n# Enable defines if the gRPC server should be enabled.\nenable = true\n
"},{"location":"docs-evm/deploy-smart-contracts/hardhat/","title":"Using Hardhat","text":""},{"location":"docs-evm/deploy-smart-contracts/hardhat/#setting-up-the-development-environment","title":"Setting up the development environment","text":"

There are a few technical requirements before we start. Please install the following:

  • Node.js v10+ LTS and npm (comes with Node)
  • Git

Once we have those installed, To install hardhat, you need to create an npm project by going to an empty folder, running npm init, and following its instructions. Once your project is ready, you should run

$ npm install --save-dev hardhat\n
To create your Hardhat project run npx hardhat in your project folder Let\u2019s create the sample project and go through these steps to try out the sample task and compile, test and deploy the sample contract.

The sample project will ask you to install hardhat-waffle and hardhat-ethers.You can learn more about it in this guide

"},{"location":"docs-evm/deploy-smart-contracts/hardhat/#hardhat-config","title":"hardhat-config","text":"
  • Go to hardhat.config.js
  • Update the hardhat-config with stratos-network-crendentials.
  • create .env file in the root to store your private key
require(\"@nomiclabs/hardhat-ethers\");\nconst fs = require('fs');\nconst privateKey = fs.readFileSync(\".secret\").toString().trim();\nmodule.exports = {\n  defaultNetwork: \"stratos\",\n  networks: {\n    hardhat: {\n    },\n    testnet: {\n      url: \"TODO\",\n      accounts: [process.env.PRIVATE_KEY]\n    },\n    stratos: {\n      url: \"TOOD\",\n      accounts: [process.env.PRIVATE_KEY]\n    },\n  },\n  solidity: {\n    version: \"0.8.4\",\n    settings: {\n      optimizer: {\n        enabled: true,\n        runs: 200\n      }\n    }\n  },\n}\n
"},{"location":"docs-evm/deploy-smart-contracts/hardhat/#deploying-on-stratos-network","title":"Deploying on Stratos Network","text":"

Run this command in root of the project directory:

$ npx hardhat run scripts/sample-script.js --network testnet\n

Contract will be deployed on Stratos's Testnet, it look like this:

Compilation finished successfully\nGreeter deployed to: 0xfaFfCAD549BAA6110c5Cc03976d9383AcE90bdBE\n

Remember your address would differ, Above is just to provide an idea of structure. Congratulations! You have successfully deployed Greeter Smart Contract. Now you can interact with the Smart Contract.

You can check the deployment status here: TODO

"},{"location":"docs-evm/deploy-smart-contracts/truffle/","title":"Using truffle","text":""},{"location":"docs-evm/deploy-smart-contracts/truffle/#setting-up-the-development-environment","title":"Setting up the development environment","text":"

There are a few technical requirements before we start. Please install the following:

  • Node.js v8+ LTS and npm (comes with Node)
  • Git

Once we have those installed, we only need one command to install Truffle:

npm install -g truffle\n

To verify that Truffle is installed properly, type truffle version on a terminal. If you see an error, make sure that your npm modules are added to your path.

If you're new to Truffle then please follow the Getting Started by truffle, To setup the truffle environment.

"},{"location":"docs-evm/deploy-smart-contracts/truffle/#truffle-config","title":"truffle-config","text":"
  • Go to truffle-config.js
  • Update the truffle-config with stratos-network-crendentials.
const HDWalletProvider = require('@truffle/hdwallet-provider');\nconst fs = require('fs');\nconst mnemonic = fs.readFileSync(\".secret\").toString().trim();\n\nmodule.exports = {\n  networks: {\n    development: {\n      host: \"127.0.0.1\",     // Localhost (default: none)\n      port: 8545,            // Standard Ethereum port (default: none)\n      network_id: \"*\",       // Any network (default: none)\n    },\n    // mainnet\n    stratos: {\n      provider: () => new HDWalletProvider(mnemonic, `TODO`),\n      network_id: 2048,\n      confirmations: 1,\n      timeoutBlocks: 200,\n      skipDryRun: true\n    },\n    // testnet\n    testnet: {\n      provider: () => new HDWalletProvider(mnemonic, `TODO`),\n      network_id: 2047,\n      confirmations: 1,\n      timeoutBlocks: 200,\n      skipDryRun: true\n    },\n  },\n\n  // Set default mocha options here, use special reporters etc.\n  mocha: {\n    // timeout: 100000\n  },\n\n  // Configure your compilers\n  compilers: {\n    solc: {\n    }\n  }\n}\n

Notice, it requires mnemonic to be passed in for stratos/testnet Provider, this is the seed phrase for the account you'd like to deploy from. Create a new .secret file in root directory and enter your 12 word mnemonic seed phrase to get started. To get the seedwords from metamask wallet you can go to Metamask Settings, then from the menu choose Security and Privacy where you will see a button that says reveal seed words.

"},{"location":"docs-evm/deploy-smart-contracts/truffle/#deploying-on-stratos-network","title":"Deploying on Stratos Network","text":"

Run this command in root of the project directory:

$ truffle migrate --network testnet\n

Contract will be deployed on Stratos's Testnet, it look like this:

2_deploy_contracts.js\n=====================\n\n   Replacing 'MyContract'\n   ------------------\n   > transaction hash:    0x1c94d095a2f629521344885910e6a01076188fa815a310765679b05abc09a250\n   > Blocks: 5            Seconds: 5\n   > contract address:    0xbFa33D565Fcb81a9CE8e7a35B61b12B04220A8EB\n   > block number:        2371252\n   > block timestamp:     1578238698\n   > account:             0x9fB29AAc15b9A4B7F17c3385939b007540f4d791\n   > balance:             79.409358061899298312\n   > gas used:            1896986\n   > gas price:           0 gwei\n   > value sent:          0 ETH\n   > total cost:          0 ETH\n\n   Pausing for 2 confirmations...\n   ------------------------------\n   > confirmation number: 5 (block: 2371262)\ninitialised!\n\n   > Saving migration to chain.\n   > Saving artifacts\n   -------------------------------------\n   > Total cost:                   0 ETH\n\n\nSummary\n=======\n> Total deployments:   2\n> Final cost:          0 ETH\n

Remember your address, transaction_hash and other details provided would differ, Above is just to provide an idea of structure.

Congratulations! You have successfully deployed HelloWorld Smart Contract. Now you can interact with the Smart Contract.

You can check the deployment status here: TODO

"},{"location":"docs-evm/wallets/metamask/configure-on-metamask/","title":"Configure Stratos on MetaMask","text":""},{"location":"docs-evm/wallets/metamask/configure-on-metamask/#configure-stratos-on-metamask","title":"Configure Stratos on Metamask","text":"

In order to view the flow of funds in your accounts, on the Stratos Network, you will need to configure Stratos Mainnet or TestNet URL on Metamask.

MainnetTestnet (Mesos)

To add Stratos Mainnet Network details to Metamask, follow these instructions:

  • Open Metamask and click on the networks button in the upper left corner:

  • Click Add network:

  • Click Add a network manually:

  • In the next screen, enter the following details and click Save:
Setting Name Value Network name Stratos Mainnet New RPC URL https://web3-rpc.thestratos.org Chain ID 2048 Currency symbol STOS Block Explorer URL https://web3-explorer.thestratos.org

To add Stratos Testnet Network details to Metamask, follow these instructions:

  • Open Metamask and click on the networks button in the upper left corner:

  • Click Add network:

  • Click Add a network manually:

  • In the next screen, enter the following details and click Save:
Setting Name Value Network name Stratos Testnet New RPC URL https://web3-rpc-mesos.thestratos.org Chain ID 2048 Currency symbol STOS Block Explorer URL https://web3-explorer-mesos.thestratos.org

"},{"location":"docs-evm/wallets/metamask/gas-token/","title":"STOS Gas Token","text":"MainnetTestnet (Mesos)

STOS is the native token of Stratos. This is similar to Ether in Ethereum. To interact with Stratos, STOS tokens are required to pay as gas fees.

On the Stratos chain, the Stratos tokens works as native token. This means that a user can pay gas with STOS as well as send STOS to other accounts same way as they use ETH to pay gas fees on Ethereum and send ETH to others.

Getting the STOS token is really easy. Ways to get STOS token for Stratos:

  • Step 1: Get STOS via USDT:
  • Decentralized Exchanges (DEX)

    • Uniswap
    • 1inch
  • Centralized Exchanges (CEX)

    • Gate.io
    • MEXC
    • AscendEX
  • Step 2: Migrate STOS Token:

    • [DEX] Mainnet bridge
    • [DEX] Testnet bridge (for testing before using real tokens)

\ud83c\udf89Voila, you can start interacting with Stratos now \ud83c\udf89

STOS is the native token of Mesos. This is similar to Ether in Ethereum. To interact with Mesos network, STOS tokens are required to pay as gas fees.

On the Mesos chain, the Mesos tokens works as native token. This means that a user can pay gas with STOS as well as send STOS to other accounts same way as they use ETH to pay gas fees on Ethereum and send ETH to others.

If you want to get some test tokens, reach out to @devrawl on Telegram or Discord.

"},{"location":"docs-evm/wallets/metamask/hello/","title":"How to create a MetaMask Wallet?","text":"

If you are wondering how to create a new cryptocurrency wallet, consider creating one by installing the MetaMask extension.

MetaMask is a free and secure browser extension that allows web applications to read and interact with the Ethereum blockchain.

"},{"location":"docs-evm/wallets/metamask/hello/#step-1-install-metamask-on-your-browser","title":"Step 1. Install MetaMask on your browser","text":"

To create a new wallet with MetaMask you need to install the extension first. You can install Metamask for Chrome, Firefox, Brave and Opera browsers.

  1. Open https://metamask.io or search for \u201cMetamask extension\u201d using your favorite search engine.

In this tutorial we will be using Google Chrome as an example, but the workflow is the same for all browsers.

  1. Click Chrome to install MetaMask as a Google Chrome extension.

  2. Click Add to Chrome.

  3. Click Add Extension.

That\u2019s it! You have successfully installed MetaMask extension!

"},{"location":"docs-evm/wallets/metamask/hello/#step-2-create-an-account","title":"Step 2. Create an account","text":"

The next step is to create an account.

  1. Click on the MetaMask icon in the upper right corner to open the extension.
  2. To install the latest version of MetaMask, click Try it now.
  3. Click Continue.

  1. You will be asked to create a new password. Create a strong password and click Create.

Don\u2019t forget to store your password for safekeeping!

  1. Proceed by clicking Next, then accept Terms of Use.

  2. Click Reveal secret words.

  3. You will see a 12 words seed phrase. Save seed words as a file or copy them to a safe place and click Next.

Reveal secret words and copy your secret backup phrase to a safe place

Security tips:Write this phrase on a piece of paper and store in a secure location. If you want even more security, write it down on multiple pieces of paper and store each in 2\u20133 different locations.Memorize this phrase.

  1. Verify your secret phrase by selecting the previously generated phrase. When done, click Confirm.

By \u201csolving this puzzle\u201d you are confirming that you know your secret phrase

Congratulations! You have successfully created your MetaMask account. A new Ethereum wallet address was automatically generated for you!

"},{"location":"docs-evm/wallets/metamask/multiple-accounts/","title":"Multiple Accounts","text":"

In case you are new to Ethereum and Metamask, here is a guide on how to create multiple accounts:

To create multiple accounts, you click on Profile icon on Metamask and then click on Create Account

You can then add an account name and click on Create.

You can create more accounts this way. When you create multiple accounts, your addresses will be different at your end.

"},{"location":"docs-resource-node/ppd-terminal-subcommands/","title":"SDS ppd terminal subcommands","text":"

ppd terminal subcommands are used to operate PP(resource) node in ppd terminal command-line terminal

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#help","title":"help","text":"

Show all the ppd terminal sub-commands' description.

>help\n\nhelp                                                           show all the commands\nwallets                                                        acquire all wallet wallets' address\nnewwallet                                                      create new wallet, input password in prompt\nregisterpeer                                                   register peer to meta node\nrp                                                             register peer to meta node\nactivate <amount> <fee> [--gas=<gas>]                          send transaction to stchain to become an active PP node\nupdateDeposit <depositDelta> <fee> [--gas=<gas>]               send transaction to stchain to update active pp's deposit\ndeactivate <fee> [--gas=<gas>]                                 send transaction to stchain to stop being an active PP node\nstartmining                                                    start mining\nprepay <amount> <fee> [--beneficiary=<beneficiary>] [--gas=<gas>]              \n                                                               prepay stos to get ozone\nput <filepath> [--isEncrypted=<isEncrypted>] [--nodeTier=<nodeTier>] [--allowHigherTier=<allowHigherTier>]\n                                                               upload file, need to consume ozone\nputstream <filepath> [--nodeTier=<nodeTier>] [--allowHigherTier=<allowHigherTier>]\n                                                               upload video file for streaming, need to consume ozone. (alpha version, encode format config impossible)\nlist <filename>                                                query uploaded file by self\nlist <page id>                                                 query all files owned by the wallet, paginated\ndelete <filehash>                                              delete file\nget <sdm://account/filehash> <saveAs>                          download file, need to consume ozone\n    e.g:\u00a0get sdm://st1jn9skjsnxv26mekd8eu8a8aquh34v0m4mwgahg/v05ahm50ugfjrgd3ga8mqi6bqka32ks3dooe1p9g\nsharefile <filehash> <duration> <is_private>                   share an uploaded file\nallshare                                                       list all shared files\ngetsharefile <sharelink> <password>                            download a shared file, need to consume ozone\ncancelshare <shareID>                                          cancel a shared file\nclearexpshare                                                  clear all expired share links\nver                                                            version\nmonitor                                                        show monitor\nstopmonitor                                                    stop monitor\nmonitortoken                                                   show token for pp monitor service\nconfig  <key> <value>                                          set config key value\ngetoz <walletAddress>                                          get current ozone balance\nstatus                                                         get current resource node status\nfilestatus <filehash>                                          get current state of an uploaded file\nbackupstatus <filehash>                                        get backup status of an file\nmaintenance start <duration>                                   put the node in maintenance mode for the requested duration (in seconds)\nmaintenance stop                                               stop the current maintenance\ndowngradeinfo                                                  get information of last downgrade happened on this pp node\nperformancemeasure                                             turn on performance measurement log for 60 seconds\nwithdraw <amount> <fee> [--targetAddr=<targetAddr>] [--gas=<gas>]\n                                                               withdraw matured reward (from address is the configured node wallet)\nsend <toAddress> <amount> <fee> [--gas=<gas>]                  sending coins to another account (from address is the configured node wallet)\nupdateinfo <fee> [--moniker=<moniker>] [--identity=<identity>] [--website=<website>]\n           [--security_contact=<security_contact>] [--details=<details>] [--gas=<gas>]\n                                                               update pp node info, including the beneficiary address from config file\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#wallets","title":"wallets","text":"

acquire all wallets' addresses

wallets\n

Example:

>wallets\n[INFO] 2023/01/12 11:18:07 account.go:109: st16v5pcrj9m6fgmwm7w0fn6dyxe8er3dk2nqqrhf\n[INFO] 2023/01/12 11:18:07 account.go:109: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#newwallet","title":"newwallet","text":"

create a new wallet or recover an existing wallet, input password after prompt

newwallet <wallet_name>\n

Example:

>newwallet mySecondWallet\nEnter wallet nickname: mySecondWallet\nEnter password: \nEnter password again: \ninput bip39 mnemonic (leave blank to generate a new one)\ninput hd-path for the account, default: \"m/44'/606'/0'/0/0\" : \nsave the mnemonic phase properly for future recovery: \n-=======================================================================  \nmother bracket treat warfare become win ivory harvest course reform theory issue group super alpha library despair sustain orient shrug lizard bulk mistake magnet\n-======================================================================= \n\n[INFO] 2023/01/12 11:17:00 setup_wallet.go:61: Wallet st16v5pcrj9m6fgmwm7w0fn6dyxe8er3dk2nqqrhf has been generated successfully\nDo you want to use this wallet as your node wallet: Y(es)/N(o): y\n[INFO] 2023/01/12 11:17:03 setting.go:291: finished changing configuration file  wallet_address:  st16v5pcrj9m6fgmwm7w0fn6dyxe8er3dk2nqqrhf\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#rp-or-registerpeer","title":"rp or registerpeer","text":"

Register a Resource Node to an SP(meta) node.

Example:

>rp\n>[INFO] 2023/01/11 19:10:45 register_new_pp.go:25: get RspRegisterNewPP\n[INFO] 2023/01/11 19:10:45 register_new_pp.go:31: get RspRegisterNewPP RES_SUCCESS \n[INFO] 2023/01/11 19:10:45 register_new_pp.go:40: registered as PP successfully, you can deposit by `activate`\n

Tip

After receiving the response registered as PP successfully, you can deposit by activate, you can execute the next activate command to activate your resource node.

rp or registerpeer command may raise an error because of its CPU chips which are not supported by SDS currently. For instance

# Run on Macs with an Arm-based M1 chip\n\n>rp\n[ERROR]2022/04/15 11:38:22 service.go:185: RPC method sds_registerPP crashed: runtime error: index out of range [0] with length 0\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#activate","title":"activate","text":"

Send transaction to Stratos chain to become an active Resource Node

activate <amount> <fee> [--gas=gas] \n

Tip

amount is the amount of tokens you want to deposit. 1stos = 10^9gwei = 10^18wei.

fee is the amount of tokens to pay as a fee for the activation transaction. 10000wei would work. It will use default value if not provide.

gas is the amount of gas to pay for the transaction. 1000000 would be a safe number. It will use default value if not provide.

Example:

>activate 2stos 0.01stos --gas=1000000\nRequest Accepted\n[INFO] 2023/01/12 18:49:39 activate.go:66: get RspActivatePP RES_SUCCESS \n[INFO] 2023/01/12 18:49:41 activate.go:83: The activation transaction was broadcast\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#updatedeposit","title":"updateDeposit","text":"

Update deposit of an active resource node.

updateDeposit <depositDelta> <fee> [--gas=gas] \n

Tip

depositDelta is the absolute amount of difference between the original and the updated deposit. It should be a positive valid token, in the unit of stos/gwei/wei.

When a resource node is suspended, use this command to update its state and re-start mining by increasing its deposit.

Example:

The following command will increase 1stos to deposit, use 10000gwei for tx fees and 1000000 for tx gas.

>updateDeposit 1stos 1000000gwei --gas=1000000\nRequest Accepted\n

Tip

When a resource node is Mining: SUSPEND due to poor performance(e.g., frequently offline, task uncompleted, unstable connection, unreachable node, etc.), use this command to update its state and re-start mining by increasing its deposit.

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#deactivate","title":"deactivate","text":"

send transaction to Stratos-chain to stop being an active resource node

deactivate <fee> [--gas=gas]\n

Example:

>deactivate 10000000gwei --gas=1000000\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#startminingdeprecated","title":"startmining(deprecated)","text":"

Resource node will start to receive tasks from meta nodes and thus gain mining rewards. From SDS v0.7.0, user does not need to use this command any more since resource node will start mining automatically when the status of a resource node is Mining: ONLINE.

Example:

startmining\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#prepay","title":"prepay","text":"

Ozone is the unit of traffic used by SDS. Operations involving network traffic require ozone to be executed. User can always prepay stos to get Ozone any time before uploading/downloading files.

prepay <amount> <fee> [--beneficiary=<beneficiary>] [--gas=<gas>]  \n

Tip

amount is the amount of tokens you want to spend to purchase ozone.

The other two parameters are the same as above.

Example:

>prepay 1stos 6000000gwei --gas=6000000\nRequest Accepted\n>[INFO] 2023/01/12 10:59:07 prepay.go:24: Sending prepay message to SP! st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4\n[INFO] 2023/01/12 10:59:07 prepay.go:37: get RspPrepay RES_SUCCESS \n[INFO] 2023/01/12 10:59:09 prepay.go:46: The prepay transaction was broadcast\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#put","title":"put","text":"

upload a file. It will consume Ozone.

put <filepath> [--isEncrypted=<isEncrypted>] [--nodeTier=<nodeTier>] [--allowHigherTier=<allowHigherTier>]\n
filepath is the location of the file to upload, starting from your resource node folder. It is better to be an absolute path.

Example:

>put relayd/node1/relayd.toml\n[INFO] 2023/01/12 12:00:05 requests.go:178: fileName~~~~~~~~~~~~~~~~~~~~~~~~ relayd.toml\n[INFO] 2023/01/12 12:00:05 requests.go:184: fileHash~~~~~~~~~~~~~~~~~~~~~~ v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\nRequest Accepted\n>[INFO] 2023/01/12 12:00:07 upload_slice.go:341: fileHash: v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg  uploaded\uff1a100.00 %\n[INFO] 2023/01/12 12:00:07 print.go:20: ####################################################################################################\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#putstream","title":"putstream","text":"

Upload a media file for streaming

Streaming is the continuous transmission of audio or video files(media files) from a server to a client. In order to upload a streaming file, first you need to install a tool ffmpeg for transcoding multimedia files.

Note

Please note that once a media file is uploaded via this command in streaming format, it is not allowed to be downloaded via regular get command in the current version. Instead, it has to be played through the APIs that are designed for playing streaming videos.

In Linux Terminal:

sudo apt update\nsudo apt install ffmpeg\n\n# use ffmpeg -version to check its version\nffmpeg -version\n
In MacOS Terminal:

brew update\nbrew install ffmpeg\n

Then, use putstream command to upload a media file

putstream <filepath> [--nodeTier=<nodeTier>] [--allowHigherTier=<allowHigherTier>]\n

filepath is the absolute path of the file to be uploaded, or a relative path starting from the root directory of the resource node.

Example:

putstream example_01.mp4\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#list-or-ls","title":"list or ls","text":"

List all uploaded files

ls\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#list-filename","title":"list <filename>","text":"

Query a specific uploaded file by name

ls filename\n

Example:

>ls relayd.toml\nRequest Accepted\n>[INFO] 2023/01/12 12:01:58 find_file.go:71: _______________________________\n[INFO] 2023/01/12 12:01:58 find_file.go:76: File name: relayd.toml\n[INFO] 2023/01/12 12:01:58 find_file.go:77: File hash: v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\n[INFO] 2023/01/12 12:01:58 find_file.go:79: CreateTime : 1673542807\n[INFO] 2023/01/12 12:01:58 find_file.go:88: ===============================\n[INFO] 2023/01/12 12:01:58 find_file.go:89: Total: 1  Page: 0\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#list-page_id","title":"list <page_id>","text":"

Query all files owned, paginated by 20 items per page by default, starting with page 0.

ls page_id\n

Example:

>ls 0\nRequest Accepted\n>[INFO] 2023/01/12 12:03:07 find_file.go:71: _______________________________\n[INFO] 2023/01/12 12:03:07 find_file.go:76: File name: relayd.toml\n[INFO] 2023/01/12 12:03:07 find_file.go:77: File hash: v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\n[INFO] 2023/01/12 12:03:07 find_file.go:79: CreateTime : 1673542807\n[INFO] 2023/01/12 12:03:07 find_file.go:88: ===============================\n[INFO] 2023/01/12 12:03:07 find_file.go:89: Total: 1  Page: 0\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#delete","title":"delete","text":"

Delete an uploaded file

delete <filehash>\n

Example:

>delete v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\nRequest Accepted\n>[INFO] 2023/01/12 12:04:51 delete_file.go:36: delete success\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#get","title":"get","text":"

Download an uploaded file

get <sdm://account/filehash> [saveAs]\n

Tip

Every file uploaded to SDS is attributed with a unique file hash.

View the file hash for each of your files when you list your uploaded files.

Use the optional parameter saveAs to rename the file.

The downloaded files will be saved into the folder download by default under the root directory of your resource node, like

.\n\u251c\u2500\u2500 accounts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 st1la7aj36gk88puz3026t3mkqfeu4q8paj3rs4gk.json\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 stsds1x5cse46ru8phd0435ncm04vh4mzj8ntp8rtpu4.json\n\u251c\u2500\u2500 configs\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 config.toml\n\u251c\u2500\u2500 download                # default downloading dir\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md       # downloaded file\n\u251c\u2500\u2500 peers\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 pp-list\n\u2514\u2500\u2500 tmp\n    \u2514\u2500\u2500 logs\n

The download folder is defined by download_path in the file configs/config.toml under the root directory of your resource node.

Example:

>get sdm://st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4/v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\nRequest Accepted\n>[INFO] 2023/01/12 12:47:31 query_file_info.go:253: get\uff0cRspFileStorageInfo\n\n[INFO] 2023/01/12 12:47:31 download_slice.go:391: download starts: \n[INFO] 2023/01/12 12:47:31 download_task.go:431: downloaded\uff1a100.00 % \n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#sharefile","title":"sharefile","text":"

Share(public) an uploaded file

sharefile <filehash> <duration> <is_private>\n

Tip

duration is time period(in seconds) when the file share expires. Put 0 for unlimited time.

is_private is whether the file share should be protected by a password. Put 0 for public file without password, and 1 for private file with a password.

After this command has been executed successfully, SDS will provide a password to this shared file, like m216.Please keep this password for future use.

Example:

>sharefile v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg 0 1\nRequest Accepted\n>[INFO] 2023/01/12 12:53:04 share.go:131: ShareId 348f79a5a0963a56\n[INFO] 2023/01/12 12:53:04 share.go:132: ShareLink hFu8ce_348f79a5a0963a56\n[INFO] 2023/01/12 12:53:04 share.go:133: SharePassword m216\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#allshare","title":"allshare","text":"

List All Shared Files.

allshare\n

Example:

>allshare\nRequest Accepted\n> [INFO] 2023/01/12 12:30:21 share.go:75: _______________________________\n[INFO] 2023/01/12 12:30:21 share.go:76: file_name: relayd.toml\n[INFO] 2023/01/12 12:30:21 share.go:77: file_hash: v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\n[INFO] 2023/01/12 12:30:21 share.go:78: file_size: 676\n[INFO] 2023/01/12 12:30:21 share.go:79: link_time: 1673544576\n[INFO] 2023/01/12 12:30:21 share.go:80: link_time_exp: 1689096576\n[INFO] 2023/01/12 12:30:21 share.go:81: ShareId: e9546b33e3d63285\n[INFO] 2023/01/12 12:30:21 share.go:82: ShareLink: 4RREV0_e9546b33e3d63285\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#getsharefile","title":"getsharefile","text":"

Download a shared file.

getsharefile <sharelink> [password]\n

Tip

Leave the password blank if it's a public shared file.

sharelink could be found when your use allshare to list all available shared files.

The downloaded files will be saved into the folder download by default under the root directory of your resource node.

Example:

>getsharefile 4RREV0_e9546b33e3d63285\nRequest Accepted\n> [INFO] 2023/01/12 12:31:38 share.go:216: get RspGetShareFile RES_SUCCESS request success\n[INFO] 2023/01/12 12:31:38 share.go:222: FileInfo: [file_size:676  file_hash:\"v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\"  file_name:\"relayd.toml\"  create_time:1673542807  owner_wallet_address:\"st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4\"  share_link:\"4RREV0_e9546b33e3d63285\"]\n[INFO] 2023/01/12 12:31:38 query_file_info.go:253: get\uff0cRspFileStorageInfo\n\n[INFO] 2023/01/12 12:31:38 download_slice.go:391: download starts: \n[INFO] 2023/01/12 12:31:39 download_task.go:431: downloaded\uff1a100.00 % \n\n[INFO] 2023/01/12 12:31:39 print.go:20: ####################################################################################################\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#cancelshare","title":"cancelshare","text":"

Cancel file share

cancelshare <shareID>\n

shareID could be found when your use allshare to list all available shared files

Example:

>cancelshare e9546b33e3d63285\nRequest Accepted\n>[INFO] 2023/01/12 12:52:20 share.go:172: cancel share success: e9546b33e3d63285\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#clearexpshare","title":"clearexpshare","text":"

Deletes all the expired shared links.

clearexpshare\n

Example:

>clearexpshare\nRequest Accepted\n[INFO] 2023/08/08 09:41:24 clear_expired_share.go:52: ClearExpiredShareLinks done, 8 cleared, 0 remaining\n
"},{"location":"docs-resource-node/ppd-terminal-subcommands/#ver","title":"ver","text":"

show current SDS version

Example:

>ver\nversion: v0.10.0\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#monitor","title":"monitor","text":"

View resource utilization.

monitor\n

Example:

# show the resource utilization monitor\n>monitor\n[INFO] 2023/01/12 11:13:09 sys.go:143: __________________________________________________________________________\n[INFO] 2023/01/12 11:13:09 sys.go:144:         Mem         : 15967 MB  Free: 9497 MB Used:6127 Usage:38.372995%\n[INFO] 2023/01/12 11:13:09 sys.go:149:         CPU          : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz   1 cores \n[INFO] 2023/01/12 11:13:09 sys.go:149:         CPU          : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz   1 cores \n[INFO] 2023/01/12 11:13:09 sys.go:149:         CPU          : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz   1 cores \n[INFO] 2023/01/12 11:13:09 sys.go:149:         CPU          : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz   1 cores \n[INFO] 2023/01/12 11:13:09 sys.go:158:         CPU Used    : 93.367347% \n[INFO] 2023/01/12 11:13:09 sys.go:161:         HD          : 343 GB  Free: 160 GB Usage:51.431241% Path:/home/hong/stratos/sds-tropos5/sds/example/network/node1\n[INFO] 2023/01/12 11:13:09 sys.go:201:         Upload      : 0.000000 MB/s \n[INFO] 2023/01/12 11:13:09 sys.go:202:         Download    : 0.000000 MB/s \n[INFO] 2023/01/12 11:13:09 sys.go:203: __________________________________________________________________________\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#stopmonitor","title":"stopmonitor","text":"

Hide the resource utilization monitor

stopmonitor\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#monitortoken","title":"monitortoken","text":"

show token for Resource Node monitor service.

> monitortoken\nMonitor token is: dddd608cc1c0efaf6b87267088dbc4b099b0db0758f476e625763580991a086c\n
The returned token can be used for logging in to resource node monitor.

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#config","title":"config","text":"

Change a config key value pair in the file configs/config.toml(note: need quotes for string input. Cannot have a space character in the string).

config <key> <value>\n
Example:

config keys.wallet_password 'stratos'\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#getoz","title":"getoz","text":"

Query ozone balance of a node's wallet

getoz <walletAddress>\n

Example:

>getoz st14d6vt45ws2fz9kgma5wlcfc283xr6pqgp3sklu\ninput password\npassword: \nRequest Accepted\n> [INFO] 2023/01/12 11:01:27 get_wallet_oz.go:42: get GetWalletOz RSP, the current ozone balance of st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4 = 1008215085885, \n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#status","title":"status","text":"

Query the current status of a resource node.

status\n

Example:

>status\nRequest Accepted\n>[INFO] 2023/01/12 10:57:01 get_pp_status.go:80: *** current node status ***\nActivation: Active | Registration Status: Registered | Mining: ONLINE | Initial tier: 1 | Ongoing tier: 1 | Weight score: 5480\n

Tip

Activation indicates the activation state of a resource node, including Active, Inactive and Unbonding.

Registration indicates the registration of a resource node, including Unregistered, Registering and Registered.

Mining indicates the mining state of a resource node, including ONLINE, OFFLINE, SUSPEND and MAINTENANCE.

When a resource node becomes Mining: SUSPEND due to its poor performance, user may use updateDeposit command to update its state and re-start mining by increasing its deposit.

Meta Node assigns a Weight score to Resource Node depending on its performance. The more Weight score a Resource Node has, the more priority it has to be assigned tasks.

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#filestatus","title":"filestatus","text":"

Shows current state of an uploaded file.

filestatus <filehash>\n

Example:

>filestatus v05ahm57vf1fh2k9k3c84acha4q4m1pj6ufdppho\nRequest Accepted\n>[INFO] 2023/08/08 10:01:43 query_file_info.go:255: get RspFileStatus\n[INFO] 2023/08/08 10:01:43 query_file_info.go:277: RspFileStatus: {\"return\":\"0\",\"file_upload_state\":3,\"user_has_file\":true,\"replicas\":3}\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#backupstatus","title":"backupstatus","text":"

Shows backup state of a file.

backupstatus <filehash>\n

Example:

>filestatus v05j1m52dltbs6ift7atcsup2ab9vh03umdp7pqo\nRequest Accepted\n  >[INFO] 2024/04/22 21:38:12 upload_file.go:192: Backup status for file v05j1m52dltbs6ift7atcsup2ab9vh03umdp7pqo: current_replica is 5, desired_replica is 5, ongoing_backups is 0, delete_origin is true, need_reupload is false\n  [INFO] 2024/04/22 21:38:12 upload_file.go:196: Backup is finished for file v05j1m52dltbs6ift7atcsup2ab9vh03umdp7pqo, delete all the temporary slices \n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#maintenance-start","title":"maintenance start","text":"

Claim a maintenance. Put the resource node in maintenance mode for the requested duration (in seconds).

maintenance start <duration> \n

Tip

  • maintenance start <duration> command starts a maintenance activity and switches the node into maintenance mode for the requested duration (in seconds);
  • While a Resource Node is in maintenance mode, it will be opt-out from any download/upload/backup tasks;
  • While a Resource Node is in maintenance mode, it will NOT be slashed for its off-line;
  • The maintenance allowance is maxed out after reach 1% up-time per year(around 87h). Then, any maintenance request will be rejected;
  • The maintenance allowance will be tracked and be reset every calendar year for all nodes;
  • When using the maintenance stop to stop the current maintenance, or the maintenance period is over, the node status reverts to offline and is ready to restart mining. It acts as usual to earn rewards or be slashed.

Example:

>maintenance start 600\nRequest Accepted\n>[INFO] 2023/01/12 12:57:21 maintenance.go:19: Sending maintenance start request to SP!\n\n>status\nRequest Accepted\n> [INFO] 2023/01/12 12:58:19 get_pp_status.go:80: *** current node status ***\nActivation: Active | Mining: MAINTENANCE | Initial tier: 1 | Ongoing tier: 1 | Weight score: 5020\n
Note: Mining: MAINTENANCE indicates that this node is in maintenance mode.

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#maintenance-stop","title":"maintenance stop","text":"

stop the current maintenance.

>maintenance stop\nRequest Accepted\n>[INFO] 2023/01/12 12:58:35 maintenance.go:26: Sending maintenance stop request to SP!\n[INFO] 2023/01/12 12:58:38 register_to_sp.go:104: start mining\n\n>status\nRequest Accepted\n> [INFO] 2023/01/12 12:59:22 get_pp_status.go:80: *** current node status ***\nActivation: Active | Mining: ONLINE | Initial tier: 1 | Ongoing tier: 1 | Weight score: 5020\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#downgradeinfo","title":"downgradeinfo","text":"

Get the information of last downgrade happened on this resource node.

> downgradeinfo\nRequest Accepted\n> [INFO] 2023/01/12 10:43:12 get_pp_downgrade_info.go:24: PP downgrade happened at: 111624 (heights) ago, \nat SP node stsds15sya4n40da64z6n6hvk0p9f7sx72hqpjjnrf9y, score decreased by 9999\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#performancemeasure","title":"performancemeasure","text":"

Turn on performance measurement log for 60 seconds.

> performancemeasure\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#withdraw","title":"withdraw","text":"

Withdraw matured reward.

withdraw <amount> <fee> [--targetAddr=<targetAddr>] [--gas=<gas>]\n

Example:

> withdraw 100stos 0.01stos --targetAddr=st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\n> [INFO] 2023/11/30 05:51:38 withdraw.go:42: Withdraw transaction delivered.\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#send","title":"send","text":"

Sending coins to another account.

send <toAddress> <amount> <fee> [--gas=<gas>]\n

Example:

> send st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l 100wei 0.01stos --gas=6000000\n> [INFO] 2023/07/10 11:32:43 send.go:35: Send transaction delivered.\n

"},{"location":"docs-resource-node/ppd-terminal-subcommands/#updateinfo","title":"updateinfo","text":"

update pp node info, including the beneficiary address from config file

updateinfo <fee> [--moniker=<moniker>] [--identity=<identity>] [--website=<website>] [--security_contact=<security_contact>] [--details=<details>] [--gas=<gas>]\n

Example:

>updateinfo 0.1stos --gas=1000000\nRequest Accepted\n>[INFO] 2024/05/13 09:56:21 update_resource_node.go:66: Send transaction delivered.\n\n\n>updateinfo 0.1stos --moniker=newmoniker --identity=newIdentity --website=newWebsite --security_contact=newSecurityContact --details=newDdetails --gas=1000000\nRequest Accepted\n>[INFO] 2024/05/13 09:58:13 update_resource_node.go:66: Send transaction delivered.\n

You can exit the ppd terminal command-line terminal by typing exit and leave the ppd start terminal to run the resource node in background.

"},{"location":"docs-resource-node/rpc-client/","title":"SDS RPC client usage","text":""},{"location":"docs-resource-node/rpc-client/#-help","title":"- help","text":"
Usage:\n  rpc_client [command]\n\nAvailable Commands:\n  completion  Generate the autocompletion script for the specified shell\n  get         download a file\n  getozone    get the ozone of the wallet\n  getshared   download a shared file\n  help        Help about any command\n  list        list files\n  listshared  list shared files\n  put         upload a file\n  putstream   upload a file\n  share       share a file from uploaded files\n  stopshare   stop sharing a file\n  withdraw    withdraw matured reward\n  send        sending coins to another account\n\nFlags:\n  -h, --help            help for rpc_client\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n\nUse \"rpc_client [command] --help\" for more information about a command.\n
"},{"location":"docs-resource-node/rpc-client/#-completion","title":"- completion","text":"

Generates the autocompletion script for rpc_client for the specified shell.

Usage:\n  rpc_client completion [command]\n\nAvailable Commands:\n  bash        Generate the autocompletion script for bash\n  fish        Generate the autocompletion script for fish\n  powershell  Generate the autocompletion script for powershell\n  zsh         Generate the autocompletion script for zsh\n\nFlags:\n  -h, --help   help for completion\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n\nUse \"rpc_client completion [command] --help\" for more information about a command.\n

"},{"location":"docs-resource-node/rpc-client/#for-bash","title":"for bash","text":"

To load completions in your current shell session:

source <(rpc_client completion bash)\n

To load completions for every new session, execute once:

Tip

This script depends on the bash-completion package.

If it is not installed already, you can install it via your OS's package manager.

  • For Linux:
rpc_client completion bash > /etc/bash_completion.d/rpc_client\n
  • For MacOS:
rpc_client completion bash > $(brew --prefix)/etc/bash_completion.d/rpc_client\n

You will need to start a new shell for this setup to take effect.

"},{"location":"docs-resource-node/rpc-client/#for-fish","title":"for fish","text":"

To load completions in your current shell session:

rpc_client completion fish | source\n

To load completions for every new session, execute once:

rpc_client completion fish > ~/.config/fish/completions/rpc_client.fish\n

You will need to start a new shell for this setup to take effect.

"},{"location":"docs-resource-node/rpc-client/#for-powershell","title":"for powershell","text":"

To load completions in your current shell session:

rpc_client completion powershell | Out-String | Invoke-Expression\n

To load completions for every new session, add the output of the above command to your powershell profile.

"},{"location":"docs-resource-node/rpc-client/#for-zsh","title":"for zsh","text":"

If shell completion is not already enabled in your environment you will need to enable it. You can execute the following once:

echo \"autoload -U compinit; compinit\" >> ~/.zshrc\n

To load completions in your current shell session:

source <(rpc_client completion zsh); compdef _rpc_client rpc_client\n

To load completions for every new session, execute once:

  • For Linux:
rpc_client completion zsh > \"${fpath[1]}/_rpc_client\"\n
  • For MacOS:
rpc_client completion zsh > $(brew --prefix)/share/zsh/site-functions/_rpc_client\n

You will need to start a new shell for this setup to take effect.

"},{"location":"docs-resource-node/rpc-client/#-get","title":"- get","text":"

Downloads a file.

Usage:\n  rpc_client get <sdm://account/filehash> [flags]\n\nFlags:\n  -h, --help   help for get\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client get sdm://st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72/v05ahm500bfpivst07iti9krii5llj608mduoo82 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/20 11:56:15 main.go:463: - start downloading the file:  sdm://st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72/v05ahm500bfpivst07iti9krii5llj608mduoo82\n[INFO] 2023/03/20 11:56:15 main.go:475: - request downloading the file (method: user_requestDownload)\n[INFO] 2023/03/20 11:56:25 main.go:576: - downloading is done\n

"},{"location":"docs-resource-node/rpc-client/#-getozone","title":"- getozone","text":"

Queries ozone amount from a wallet address.

Usage:\n  rpc_client getozone [flags]\n\nFlags:\n  -h, --help   help for getozone\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client getozone --url http://127.0.0.1:4444 --wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/20 12:01:20 main.go:697: - request ozone balance (method: user_requestGetOzone)\n[INFO] 2023/03/20 12:01:20 main.go:719: - received response (return: SUCCESS)\n[INFO] 2023/03/20 12:01:20 main.go:721: OZONE balance:  45511.741533115\n

"},{"location":"docs-resource-node/rpc-client/#-getshared","title":"- getshared","text":"

Downloads a shared file.

Usage:\n  rpc_client getshared <filehash> [flags]\n\nFlags:\n  -h, --help   help for getshared\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client getshared v05ahm500bfpivst07iti9krii5llj608mduoo82 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/20 12:04:59 main.go:1015: - start downloading the file: v05ahm500bfpivst07iti9krii5llj608mduoo82\n[INFO] 2023/03/20 12:04:59 main.go:1022: - request shared file information (method: user_requestGetShared)\n

"},{"location":"docs-resource-node/rpc-client/#-list","title":"- list","text":"

Lists all files uploaded by account (wallet).

Usage:\n  rpc_client list [flags]\n\nFlags:\n  -h, --help   help for list\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client list --url http://127.0.0.1:4444 --wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/20 12:38:17 main.go:635: - request listing files (method: user_requestList)\n[INFO] 2023/03/20 12:38:17 main.go:656: - received response (return: SUCCESS)\n\nFile Name            File Hash                                 File Size Create Time\n_____________________________________________________________________________________\ntestsds1-202303142214 v05ahm5000qs4viph3u4biqt67tnels4qpguvjl8   31457280 1678824883\ntestsds1-202301221144 v05ahm5000u52005ij1osr15t0e7v8df2voh74mo   31457280 1674380707\ntestsds1-202302240758 v05ahm50010b993c3gdc28nk90bhf4aabdhaujg8   31457280 1677218311\ntestsds1-202301240119 v05ahm5001j1g84vpu28upa06n8jca40vtqbc6v8   31457280 1674516005\ntestsds1-202302092312 v05ahm500289uhi4obev6gi3vmmv5s48289vorbg   31457280 1675977162\ntestsds1-202301240902 v05ahm5002bitsbccaqv5i568vvtsnr1d2avtaa8   31457280 1674543742\ntestsds1-202301242002 v05ahm5003v4fei49lpj6rb0p1rqpjp52johdkmo   31457280 1674583378\ntestsds1-202301262228 v05ahm50040vne6f3tuk618h3me8mq4tqor3j6a0   31457280 1674764909\ntestsds1-202302181817 v05ahm5004b9epvd49uhddmmhs6g5lpfpo0h0eho   31457280 1676737093\ntestsds1-202303171340 v05ahm5004ogv5a1aa5np1m0u0q98djg0p679ih0   31457280 1679053247\ntestsds1-202301232120 v05ahm5004pvblrcqgvbu2gtmsl108dlfnsgrg80   31457280 1674501610\ntestsds1-202303041845 v05ahm5005304r88pucigun0ta3u9uirjkkroiug   31457280 1677948336\ntestsds1-202302202236 v05ahm5005bgrltqtp6eq57q8n8phsa9krtrvpsg   31457280 1676925407\ntestsds1-202302282052 v05ahm5005dpvr5p5en3hj62hqpvcjinjhqdavo0   31457280 1677610366\ntestsds1-202301211702 v05ahm5006gncteg3o7ubfl5u3g20er3jme5gkvg   31457280 1674313350\ntestsds1-202301251935 v05ahm5006is8d937529te36mpl7so1kh3des3go   31457280 1674668116\ntestsds1-202301311242 v05ahm5006tgr22ac68leu5gqitaurmqler3vt78   31457280 1675161765\ntestsds1-202301250041 v05ahm5007mtri1o1tdc9m50d2ruqspir70kejd0   31457280 1674600151\ntestsds1-202301221100 v05ahm5007n1tgrhmqbb6h9inktvqb6q7vn3in70   31457280 1674378057\ntestsds1-202301261717 v05ahm5007rcft4obagneqdv1gdnj1266bno8nco   31457280 1674746284\n_____________________________________________________________________________________\nTotal: 20    Page: 0\n

"},{"location":"docs-resource-node/rpc-client/#-listshared","title":"- listshared","text":"

Lists all files uploaded and shared by account (wallet).

Usage:\n  rpc_client listshared [flags]\n\nFlags:\n  -h, --help   help for listshared\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client listshared --url http://127.0.0.1:4444 --wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/20 11:50:08 main.go:786: - request listing files (method: user_requestListShare)\n[INFO] 2023/03/20 11:50:08 main.go:805: - received response (return: SUCCESS)\n\nFile Name            File Hash                                 File Size Link Time  Link Exp   Share ID         Share Link     \n________________________________________________________________________________________________________________________________________\ntestsds1-202301201653 v05ahm500bfpivst07iti9krii5llj608mduoo88   31457280 1674242684 1689794684 2addd621913e02e8 Xpg6U6_2addd621913e02e8\ntestsds1-202301201451 v05ahm504onf44326v8fupkl96gogma8vs85toro   31457280 1674242858 1689794858 476a8ecddbdd29a6 TS7eFc_476a8ecddbdd29a6\ntestsds1-202301201553 v05ahm503qb6igipcbmd9q1l1gbqpkiju37c59fo   31457280 1674242786 1689794786 59cf272db46dbbdb UkDPm3_59cf272db46dbbdb\ntestsds1-202301201853 v05ahm504aftmgtqerm5npdd34bb0u1lcflpgbb8   31457280 1674242825 1689794825 6615100040081212 OQ9ndm_6615100040081212\ntestsds1-202301200915 v05ahm5041mu88dr71ndp1cag0s8kgqvlr85lce0   31457280 1674242813 1689794813 6789246235828987 qAw0PV_6789246235828987\ntestsds1-202301200808 v05ahm500l93v2ghdju34h10ehpuj05c6hnqdst8   31457280 1674242748 1689794748 858408741b47a972 LwyBT8_858408741b47a972\ntestsds1-202301201816 v05ahm501ajcimbjcvrijuuts1n7d939b180o2rg   31457280 1674242769 1689794769 9cbc8114ebf949ae SGF8Uf_9cbc8114ebf949ae\ntestsds1-202301201730 v05ahm500dpnbihbch8s1qtq29ggfebft18keah8   31457280 1674242726 1689794726 a01893d8931c4639 mAvWSE_a01893d8931c4639\ntestsds1-202301200944 v05ahm5008ps226hc4etihet1gs2el8g7gvsqqd8   31457280 1674242572 1689794572 b1649c6ddf63a93a ouX59c_b1649c6ddf63a93a\ntestsds1-202301201822 v05ahm504b5g4nn3ovi5njgu1v1odbhef10p7k68   31457280 1674242841 1689794841 d8a81f46294532d5 ZpCKeK_d8a81f46294532d5\ntestsds1-202301200705 v05ahm5008hlp1k2278ojgpc1i4t30d21pb9555g   31457280 1674242538 1689794538 ecc6169ec9a95258 5Y4amn_ecc6169ec9a95258\n________________________________________________________________________________________________________________________________________\nTotal: 11       Page: 0\n

"},{"location":"docs-resource-node/rpc-client/#-put","title":"- put","text":"

Uploads a file.

Usage:\n  rpc_client put <filepath> [flags]\n\nFlags:\n  -h, --help   help for put\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client put /home/user/tmp/100MB.zip \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/20 12:14:17 main.go:179: - start uploading the file: /home/user/tmp/100MB.zip\n[INFO] 2023/03/20 12:14:17 main.go:187: - request uploading file (method: user_requestUpload)\n[INFO] 2023/03/20 12:14:33 main.go:212: - received response (return: UPLOAD_DATA)\n[INFO] 2023/03/20 12:14:33 main.go:225: - request upload date (method: user_uploadData)\n[INFO] 2023/03/20 12:14:32 main.go:244: - uploading is done\n

"},{"location":"docs-resource-node/rpc-client/#-putstream","title":"- putstream","text":"

Uploads a media file for streaming

Streaming is the continuous transmission of audio or video files(media files) from a server to a client.

In order to upload a streaming file, first you need to install a tool ffmpeg for transcoding multimedia files.

  • In Linux Terminal:
sudo apt update\nsudo apt install ffmpeg\n\n# use ffmpeg -version to check its version\nffmpeg -version\n
  • In MacOS Terminal:
brew update\nbrew install ffmpeg\n
Usage:\n  rpc_client putstream <filepath> [flags]\n\nFlags:\n  -h, --help   help for putstream\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client putstream /home/user/tmp/file_example_MP4_640_3MG.mp4 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

...\n

"},{"location":"docs-resource-node/rpc-client/#-share","title":"- share","text":"

Shares a previously uploaded file.

Usage:\n  rpc_client share <filehash> <duration> <is_private> [flags]\n\nFlags:\n  -h, --help   help for share\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Tip

duration is time period(in seconds) when the file share expires. Put 0 for unlimited time.

is_private is whether the file share should be protected by a password. Put 0 for public file without password, and 1 for private file with a password.

If is_private has been set to '1', SDS will provide a password to this shared file, like m216.

Example:

rpc_client share v05ahm500bfpivst07iti9krii5llj608mduoo82 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Response:

[INFO] 2023/03/24 13:00:01 main.go:957: - request sharing file (method: user_requestShare)\n[INFO] 2023/03/24 13:00:03 main.go:976: - received response (return: SUCCESS)\nShareId:  78912f5d9bbe939r\nShareLink:  VzW5KW_78912f5d9bbe939r\n

"},{"location":"docs-resource-node/rpc-client/#-stopshare","title":"- stopshare","text":"

Stops sharing a previously uploaded file.

Usage:\n  rpc_client stopshare <ShareID> [flags]\n\nFlags:\n  -h, --help   help for stopshare\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Tip

You can get the ShareID from the listshared command.

Example:

rpc_client stopshare 6789246235828987 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Result:

[INFO] 2023/03/20 12:34:53 main.go:913: - request stop sharing (method: user_requestStopShare)\n[INFO] 2023/03/20 12:34:54 main.go:932: - received response (return: SUCCESS)\n

"},{"location":"docs-resource-node/rpc-client/#-withdraw","title":"- withdraw","text":"

Withdraw matured reward.

Usage:\n  rpc_client withdraw <amount> <targetAddress> <fee> <gas> [flags]\n\nFlags:\n  -h, --help   help for withdraw\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client withdraw 100wei st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l 0.01stos 60000 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Result:

[INFO] 2023/07/11 14:10:31 rpc_client.go:1390: - request withdraw (method: owner_requestWithdraw)\n[INFO] 2023/07/11 14:10:31 rpc_client.go:1411: - received response (return: SUCCESS)\n

Tip

You can use 'stchaind' binary to withdraw instead.

1: Prepare the stchaind binary.

2: Convert the sds wallet key file into stchaind format using bip39 mnemonic. ./stchaind keys add testuser --home node/stchaind --keyring-backend test --hd-path \"m/44'/606'/0'/0/0\"

3: Send the 'withdraw' tx to the node through the rpc interface of the stratos-chain ./stchaind tx pot withdraw --amount=100ustos --from=st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l \\ --target-address=st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l --chain-id=testchain \\ --keyring-backend=test --home=./node/stchaind --gas=auto --gas-prices=1gwei \\ --node \"tcp://localhost:26657\"

"},{"location":"docs-resource-node/rpc-client/#-send","title":"- send","text":"

Sending coins to another account.

Usage:\n  rpc_client send <toAddress> <amount> <fee> <gas> [flags]\n\nFlags:\n  -h, --help   help for send\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client send st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l 100wei 0.01stos 60000 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n

Result:

[INFO] 2023/07/11 14:20:40 rpc_client.go:1437: - request send (method: owner_requestSend)\n[INFO] 2023/07/11 14:20:40 rpc_client.go:1458: - received response (return: SUCCESS)\n

Tip

You can use 'stchaind' binary to send instead.

1: Prepare the stchaind binary.

2: Convert the sds wallet key file into stchaind format using bip39 mnemonic. ./stchaind keys add testuser --home node/stchaind --keyring-backend test --hd-path \"m/44'/606'/0'/0/0\"

3: Send the 'send' tx to the node through the rpc interface of the stratos-chain ./stchaind tx bank send st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m 10000wei \\ --chain-id=testchain --keyring-backend=test --home=./node/stchaind --gas=auto --gas-prices=1gwei \\ --node \"tcp://localhost:26657\"

"},{"location":"docs-resource-node/sds-ipfs-handbook/","title":"SDS IPFS Command Handbook","text":""},{"location":"docs-resource-node/sds-ipfs-handbook/#ipfs-client","title":"IPFS Client","text":"

The ppd ipfs command launches an RPC-style API over HTTP client to allow user interact with a SDS Network. The API aligns with the Kubo RPC API of IPFS so that any application that supports IPFS Kubo RPC API could be updated to support SDS network with little effort. The client needs to communicate with a SDS resource node to interact with the network. For setting up a SDS resource node please refer to Setup and run a SDS Resource Node

ppd ipfs -h\n\nipfs api server attached to node demon\n\nUsage:\n  ppd ipfs [flags]\n  ppd ipfs [command]\n\nAvailable Commands:\n  config      create config file for ipfs api server\n  migrate     migrate ipfs file to sds\n\nFlags:\n  -h, --help                   help for ipfs\n      --httpRpcUrl string      http rpc url (default \"http://127.0.0.1:9301\")\n      --ipcEndpoint string     ipc endpoint path\n      --password string        wallet password\n  -p, --port string            port (default \"6798\")\n  -m, --rpcMode string         use http rpc or ipc (default \"ipc\")\n      --walletAddress string   wallet address\n\nGlobal Flags:\n  -c, --config string   configuration file path  (default \"./config/config.toml\")\n  -r, --home string     path for the node (default \"<root directory of your resource node>\")\n\nUse \"ppd ipfs [command] --help\" for more information about a command.\n

There are two modes to communicate to a SDS resource node, and it could be switched by the --rpcMode flag

  • httpRpc mode is to send RPC request over http. In this mode the httpRpcUrl flag must point to the rpc port of the resource node
    ppd ipfs --rpcMode httpRpc --httpRpcUrl http://<node url>:<node rpc port>\n
  • ipc mode is to send PRC requests over IPC (Inter-process communication). The path to the ipc endpoint is set by the flag ipcEndpoint. The default path will be used when flag is not set.
    ppd ipfs --rpcMode ipc --ipcEndpoint <path to the ipc endpoint>\n
"},{"location":"docs-resource-node/sds-ipfs-handbook/#config-file","title":"Config File","text":"

All the parameters could be pre-defined in the config file ipfs_config.toml placed in the folder config under the home path (defined by -r or --home flag).

"},{"location":"docs-resource-node/sds-ipfs-handbook/#template","title":"Template","text":"
[connectivity]\nipfs_port=\"port for the ipfs api server\"\nrpc_mode='httpRpc or ipc'\nhttp_rpc_url='http://<node url>:<node rpc port>'\nipc_endpoint='path to the ipc endpoint'\n\n[keys]\nwallet_address = 'wallet address stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\nwallet_password = 'wallet password'\n
"},{"location":"docs-resource-node/sds-ipfs-handbook/#folder-structure","title":"Folder Structure","text":"

Folder structure under the home path

Folder Content accounts wallet files Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.json\" config config file \"ipfs_config.toml\""},{"location":"docs-resource-node/sds-ipfs-handbook/#rpc-commands","title":"RPC Commands","text":""},{"location":"docs-resource-node/sds-ipfs-handbook/#apiv0add","title":"/api/v0/add","text":"

Upload a file to SDS. Arguments - arg [string]: The path to the file on the local driver. Required: yes.

cURL Example

curl -X POST  \"localhost:6798/api/v0/add?arg=testfile\"\n

"},{"location":"docs-resource-node/sds-ipfs-handbook/#apiv0get","title":"/api/v0/get","text":"

Download a file from SDS. Arguments - arg [string]: sdm path to the file in the SDS. The format is <sdm://account/filehash>. Required: yes.

Tip

Every file uploaded to SDS is attributed with a unique file hash.

View the file hash for each of your files when you list your uploaded files.

The downloaded files will be saved into the folder download by default under the root directory of your resource node, like

cURL Example

curl -X POST  \"localhost:6798/api/v0/get?arg=sdm://st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4/v05ahm51l6v6tm2vqc682b9sicom61fgkoqdl0pg\"\n

"},{"location":"docs-resource-node/sds-ipfs-handbook/#apiv0ls","title":"/api/v0/ls","text":"

Lists all files uploaded by account (wallet). Arguments - page [string]: page number. Each page contains 20 elements. Required: no.

cURL Example

curl -X POST  \"localhost:6798/api/v0/ls?page=0\"\n

"},{"location":"docs-resource-node/sds-ipfs-handbook/#ipfs-migrate","title":"IPFS Migrate","text":"

The ppd ipfs migrate command migrates a file from IPFS to SDS network. It first downloads the file from the IPS by the given CID and then uploads it to the SDS network.

ppd ipfs migrate <filecid> <filename>\n
filecid is the cid of the file to downloaded from IPFS. filename is an optional parameter. When it is given, the file will be renamed to filename before it is uploaded to the SDS network.

Example:

ipfs -m httpRpc migrate QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq spaceship.jpg\n\nAPI server listening at: [::]:40255\n[INFO] 2023/08/03 09:16:03 file.go:126: -- Getting an IPFS node running -- \nSpawning Kubo node on a temporary repo\n2023/08/03 09:16:03 failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/lucas-clemente/quic-go/wiki/UDP-Receive-Buffer-Size for details.\n[INFO] 2023/08/03 09:16:13 file.go:147: IPFS node is running\n[INFO] 2023/08/03 09:16:13 file.go:149: -- getting back files --\n[INFO] 2023/08/03 09:16:13 file.go:157: output folder: /tmp/ipfs/QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq\n[INFO] 2023/08/03 09:16:14 file.go:176: got file back from IPFS (IPFS path: /ipfs/QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq) and wrote it to /tmp/ipfs/QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq/spaceship.jpg\n[DEBUG] 2023/08/03 09:16:14 file.go:48: filehash v05ahm50sk6ldkpg2j11c5qdm5q1arair6rvuivo\n[INFO] 2023/08/03 09:16:14 rootcmd.go:59: - start uploading the file: /tmp/ipfs/QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq/spaceship.jpg\n[INFO] 2023/08/03 09:16:14 rootcmd.go:67: - request get ozone (method: user_requestGetOzone)\n[DEBUG] 2023/08/03 09:16:18 requester.go:36: -->  {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"user_requestGetOzone\",\"params\":[{\"walletaddr\":\"st1vvysda6ylqz2adauqg4djsz4rx6hv6mqv9fepp\"}]}\n[DEBUG] 2023/08/03 09:16:18 requester.go:57: <--  {\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"return\":\"0\",\"ozone\":\"19660978\",\"sequencynumber\":\"SN:0000000000000000011\"}}\n\n[INFO] 2023/08/03 09:16:18 rootcmd.go:81: - request uploading file (method: user_requestUpload)\n[DEBUG] 2023/08/03 09:16:18 requester.go:38: -->  {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"user_requestUpload\",\"params\":[{\"filename\":\"/tmp/ipfs/QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq/spaceship.jpg\",\"filesize\":276382,\"filehash\":\"v05a ... \"}]}\n[DEBUG] 2023/08/03 09:16:18 requester.go:57: <--  {\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"return\":\"1\",\"offsetstart\":0,\"offsetend\":276382}}\n\n[INFO] 2023/08/03 09:16:18 rootcmd.go:91: - received response (return: UPLOAD_DATA)\n[INFO] 2023/08/03 09:16:18 rootcmd.go:103: - request upload date (method: user_uploadData)\n[DEBUG] 2023/08/03 09:16:18 requester.go:38: -->  {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"user_uploadData\",\"params\":[{\"filehash\":\"v05ahm50sk6ldkpg2j11c5qdm5q1arair6rvuivo\",\"data\":\"/9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQV ... \"}]}\n[DEBUG] 2023/08/03 09:16:18 requester.go:57: <--  {\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"return\":\"0\"}}\n\n[INFO] 2023/08/03 09:16:18 rootcmd.go:111: - uploading is done\nuploading is done\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/","title":"SDS RPC for file operations","text":"

The API is based on JSON-RPC 2.0 specs. The user works as a client and a resource node provides service as a server.

When the client sends a request to the server by calling to a method, the server sends the response back as the return.

The format of a request message is:

{\n    \"jsonrpc\":\"2.0\",\n    \"id\":1,\n    \"method\":\"user_methodName\",\n    \"params\":[\n        {\n            \"param1\":\"valueOfParam1\",\n            \"param2\":valueOfParam2,\n            ...\n        }\n    ]\n}\n

The format of a response message is:

{\n    \"jsonrpc\":\"2.0\",\n    \"id\":1,\n    \"result\":\n        {\n            \"return\":\"1\",\n            \"extra_result_object1\":value_object1,\n            \"extra_result_object2\":value_object2,\n            ...\n        }\n}\n

When \"return\" object in \"result\" is a string encoded negative number, it carries an error.

    \"-1\":  GENERIC_ERR           \n    \"-3\":  SIGNATURE_FAILURE \n    \"-4\":  WRONG_FILE_SIZE \n    \"-5\":  OPERATION_TIME_OUT \n    \"-6\":  FILE_REQ_FAILURE \n    \"-7\":  WRONG_INPUT \n    \"-8\":  WRONG_PP_ADDRESS \n    \"-9\":  INTERNAL_DATA_FAILURE \n    \"-10\": INTERNAL_COMM_FAILURE \n    \"-11\": WRONG_FILE_INFO \n    \"-12\": WRONG_WALLET_ADDRESS\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#upload-a-file","title":"Upload a File","text":"

Three methods are used to accomplish uploading a file.

  • user_requestGetOzone: get ozone balance and sequence number
  • user_requestUpload: start uploading a file
  • user_uploadData: upload a piece of file data
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestgetozone","title":"user_requestGetOzone","text":"

A request for ozone needs to be done before uploading a file. This method allows a check for ozone balance and a sequence number to be used in next uploading methods.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters","title":"Parameters","text":"name type comment walletaddr string wallet address of the user account #### Returns name type comment return string negative: errors; \"1\": success and expect for next user_uploadData; other values: invalid ozone string the balance of nano ozone of this wallet sequencynumber string a sequence number to be used in uploading a file"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example","title":"Example","text":"

Request

{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"user_requestGetOzone\",\n  \"params\": [\n    {\n      \"walletaddr\": \"st1r2gh2h8kjtz4slek6aua95ukyd8zmey2y9uatt\"\n    }\n  ]\n}\n
Response
{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"return\": \"0\",\n    \"ozone\": \"257695561060\",\n    \"sequencynumber\": \"SN:0000000000000000028\"\n  }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestupload","title":"user_requestUpload","text":"

To request to upload a file. The result could carry the offsets of a piece of the file to be uploaded if the request succeeded.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_1","title":"Parameters","text":"name type comment filename string name of the file filesize number size of the file, in byte filehash string file hash to identify a file 1 signature object signature on this message desired_tier number the desired tier to store the file allow_higher_tier boolean if higher tier allowed when no desired tier can't be found req_time number the epoch time when this request is made

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns","title":"Returns","text":"name type comment return string negative: errors; \"1\": success and expect for next user_uploadData; other values: invalid offsetstart number the offset of beginning of the piece of file data, inclusive offsetend number the offset of end of the piece of file data, exclusive"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_1","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestUpload\",\n \"params\": [\n  {\n   \"filename\": \"test_10m\",\n   \"filesize\": 10485760,\n   \"filehash\": \"v05j1m571efv3vuk3tq7airrfglanjvts4jrd4l8\",\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"178e5a84d721d8893b402fb502cbd66dbc349536f720bdaabd1674cd99e3a5272cd8a40ba0da9a61fe71abb1d0c4530de44983531b99d0e349a801e46c7b16d100\"\n   },\n   \"desired_tier\": 2,\n   \"allow_higher_tier\": true,\n   \"req_time\": 1701267007\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"1\",\n  \"offsetstart\": 0,\n  \"offsetend\": 3500000\n }\n}\n
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_uploaddata","title":"user_uploadData","text":"

Send a piece of file data to server according to the offset previously provided by the server.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_2","title":"Parameters","text":"name type comment filehash string file hash to identify a file data string data of the piece of the file 4"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_1","title":"Returns","text":"name type comment return string negative: errors; \"1\": success and offsets for next user_uploadData; \"0\": finished uploading; other values: invalid offsetstart number the offset of begining of the piece of file data, inclusive offsetend number the offset of end of the piece of file data, exclusive"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_2","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_uploadData\",\n \"params\": [\n  {\n   \"filehash\": \"v05j1m571efv3vuk3tq7airrfglanjvts4jrd4l8\",\n   \"data\": \"xfYRzYszM+NbWW/nZJZqmI8W9aGlaFt7SBkkuL5nkx/5L ... \"\n  }\n ]\n}\n

Response

{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"return\": \"1\",\n    \"offsetstart\": 3500000,\n    \"offsetend\": 7000000\n  }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#list-files","title":"List Files","text":"

List files owned by this account.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestlist","title":"user_requestList","text":"

Request listing files owned by the account with the wallet address.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_3","title":"Parameters","text":"name type comment signature object signature on this message page number the list is paginated. Page number start from 0. req_time number the epoch time when this request is made

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_2","title":"Returns","text":"name type comment return string negative: errors; \"0\": success; other value: invalid fileinfo objects information for each file

In fileinof, these objects are included

name type comment filehash string file hash to identify the file 1 filesize number size of the file, in byte filename string name of the file createtime number unix epoch time when the file was created"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#examples","title":"Examples","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestList\",\n \"params\": [\n  {\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"75d54f5b302d5c9d34ba0fe70153b4a1d7b6e54be90585ab706dc97ce038da4431a4053f976c14d1227af2a14b5a61a5133da634380e9d7ba67830cc52c2ec5001\"\n   },\n   \"page\": 0,\n   \"req_time\": 1701313602\n  }\n ]\n}\n

Response

{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"return\": \"0\",\n    \"fileinfo\": [\n      {\n        \"filehash\": \"v05ahm51atjqkpte7gnqa94bl3p731odvvdvfvo8\",\n        \"filesize\": 200000000,\n        \"filename\": \"file1_200M_jan22\",\n        \"createtime\": 1674433580\n      },\n      {\n        \"filehash\": \"v05ahm51buqelg70rjmcbqtn2qijc7um0ds1oedo\",\n        \"filesize\": 10000000,\n        \"filename\": \"file2_10M_jan20\",\n        \"createtime\": 1674250085\n      },\n      {\n        \"filehash\": \"v05ahm52po4iteumn1v58o3marnruc7l75km9rv8\",\n        \"filesize\": 50000000,\n        \"filename\": \"file3_50M_jan20\",\n        \"createtime\": 1674250338\n      },\n      {\n        \"filehash\": \"v05ahm53ec2f5c9lh92cqapp0mvtfcdphj1deb00\",\n        \"filesize\": 100000000,\n        \"filename\": \"file1_100M_jan20\",\n        \"createtime\": 1674240637\n      },\n      {\n        \"filehash\": \"v05ahm54ia4o2p8vjpluolshiugn1mrgqqhht6o0\",\n        \"filesize\": 209715200,\n        \"filename\": \"test_200m.bin\",\n        \"createtime\": 1674489434\n      },\n      {\n        \"filehash\": \"v05ahm54qtdk0oogho52ujtk5v6rdlpbhumfshmg\",\n        \"filesize\": 10000000,\n        \"filename\": \"file4_10M_jan20\",\n        \"createtime\": 1674253605\n      }\n    ],\n    \"totalnumber\": 6\n  }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#download-a-file","title":"Download a File","text":"

To download a file, there are four methods to be used.

  • user_requestGetOzone: get ozone balance and sequence number
  • user_requestDownload: to start downloading the file
  • user_downloadData: to request a piece of file data
  • user_downloadedFileInfo: request server verification of the downloaded file
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestgetozone_1","title":"user_requestGetOzone","text":"

A request for ozone needs to be done before uploading a file. This method allows a check for ozone balance and a sequence number to be used in next uploading methods.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_4","title":"Parameters","text":"name type comment walletaddr string wallet address of the user account #### Returns name type comment return string negative: errors; \"1\": success and expect for next user_uploadData; other values: invalid ozone string the balance of nano ozone of this wallet sequencynumber string a sequence number to be used in uploading a file"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_3","title":"Example","text":"

Request

{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"user_requestGetOzone\",\n  \"params\": [\n    {\n      \"walletaddr\": \"st1r2gh2h8kjtz4slek6aua95ukyd8zmey2y9uatt\"\n    }\n  ]\n}\n
Response
{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"return\": \"0\",\n    \"ozone\": \"257695561060\",\n    \"sequencynumber\": \"SN:0000000000000000028\"\n  }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestdownload","title":"user_requestDownload","text":"

To start downloading a file. A piece of fire data is carried in the response while successfully started.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_5","title":"Parameters","text":"name type comment filehandle string url of the file in sdm:// format 5 signature object signature on this message req_time number the epoch time when this request is made Object signature name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_3","title":"Returns","text":"name type comment return string negative: errors; \"2\": file data provided; other value: invalid reqid string to identify download instances when multiple download happen at same time offsetstart number the offset of beginning of the piece of file data, inclusive offsetend number the offset of end of the piece of file data, exclusive filename string the name of the file filedata string data of the piece of the file 4"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_4","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestDownload\",\n \"params\": [\n  {\n   \"filehandle\": \"sdm://st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9/v05j1m571efv3vuk3tq7airrfglanjvts4jrd4l8\",\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"9f8a13fe02cebe66b5144d7ef308c5b1c4d2f2f47a5509fa0921fd16463e2f4f66e77ed8068934307e39a47630e3ff4c3ff62fca403eedc3b9a59997ce145d6400\"\n   },\n   \"req_time\": 1701314045\n  }\n ]\n}\n

Response

{\n \"jsonrpc\":\"2.0\",\n \"id\":1,\n \"result\":{\n  \"return\":\"2\",\n  \"reqid\":\"58bb018a-bc6d-446b-bb9c-89867b5c1fe9\",\n  \"offsetstart\":0,\n  \"offsetend\":3145728,\n  \"filename\":\"test_10m\",\n  \"filedata\":\"xfYRzYszM+NbWW/nZJZqmI8W9aGz+uNVZJAUUDdoUpbnVvd2fOFJcz54642jxk5ZjcIQQv1i/lVehc36v/Czk0Pi5PPxZK ... \"\n }\n}    \n
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_downloaddata","title":"user_downloadData","text":"

After the user handles previous piece of file data, this method is called to get the next piece.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_6","title":"Parameters","text":"name type comment filehash string file hash to identify a file 1 reqid string the same reqid get from response of user_requestDownload"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_4","title":"Returns","text":"name type comment return string negative: errors; \"2\": file data provided; \"3\": no data and ask for calling user_downloadedFileInfo reqid string to identify download instances when multiple download happen at same time offsetstart number the offset of beginning of the piece of file data, inclusive offsetend number the offset of end of the piece of file data, exclusive filename string the name of the file filedata string data of the piece of the file 4"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_5","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_downloadData\",\n \"params\": [\n  {\n   \"filehash\": \"v05ahm51buqelg70rjmcbqtn2qijc7um0ds1oedo\",\n   \"reqid\": \"c97eafef-401f-49d1-bff3-7ce9eaa2c2dd\"\n  }\n ]\n}\n

Response

{\n \"jsonrpc\":\"2.0\",\n \"id\":1,\n \"result\": {\n   \"return\": \"2\",\n   \"offsetstart\": 3145728,\n   \"offsetend\": 6291456,\n   \"filename\": \"test_10m\",\n   \"filedata\": \"QYILair4V84YdEyU+9kfOfwrGmNz7OIkxzlTcKiMk4aNcmwiLMDXScf+S17gUWpQds8oW88eLFCqdOaHPmrZYmqhFjGFV ... \"\n }\n}\n

Another Instance of Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"3\",\n  \"reqid\": \"c97eafef-401f-49d1-bff3-7ce9eaa2c2dd\"\n }\n}\n
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_downloadedfileinfo","title":"user_downloadedFileInfo","text":"

After the user received all pieces of the file and a response of user_downloadData with return value \"3\", this method is called to let the server verify file information and finish downloading.

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_7","title":"Parameters","text":"name type comment filehash string recalculated file hash upon the received file 1 filesize number size of the file, in byte reqid string the same reqid get from response of user_requestDownload"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_5","title":"Returns","text":"name type comment return string negative: errors; \"0\": successful finished; other values: invalid"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_6","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_downloadedFileInfo\",\n \"params\": [\n  {\n   \"filehash\": \"v05ahm51buqelg70rjmcbqtn2qijc7um0ds1oedo\",\n   \"filesize\": 10000000,\n   \"reqid\": \"c97eafef-401f-49d1-bff3-7ce9eaa2c2dd\"\n  }\n ]\n}\n

Response

{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"return\": \"0\"\n  }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#share-a-file","title":"Share a File","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestshare","title":"user_requestShare","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_8","title":"Parameters","text":"name type comment filehash string file hash to identify a file 1 signature object signature on this message duration number duration in second sharing the file privateflag bool if the file is private req_time number the epoch time when this request is made

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_6","title":"Returns","text":"name type comment return string negative: errors; \"0\": success; other values: invalid shareid string uniq identifier for this sharing sharelink string link for accessing this shared file"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_7","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestShare\",\n \"params\": [\n  {\n   \"filehash\": \"v05j1m571efv3vuk3tq7airrfglanjvts4jrd4l8\",\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"c1d2b4b427689cdb7a9e5cdc58a405190e07bc608ec492c2efa0bba0d7c05ec11e963ed9b78a303a6adae608642d10257b70214acad8dac658b42d11bba998f001\"\n   },\n   \"duration\": 0,\n   \"bool\": false,\n   \"req_time\": 1701315117\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"0\",\n  \"shareid\": \"78a8fe38a826fed4\",\n  \"sharelink\": \"RHumTB_78a8fe38a826fed4\"\n }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#stop-sharing-a-file","title":"Stop Sharing a File","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requeststopshare","title":"user_requestStopShare","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_9","title":"Parameters","text":"name type comment signature object signature on this message shareid string a uniq identifier for this sharing req_time number the epoch time when this request is made

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_7","title":"Returns","text":"name type comment return string negative: errors; \"0\": success; other values: invalid"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_8","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestStopShare\",\n \"params\": [\n  {\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"83e9ae4ab17df35ab73b63104710414029adc5ebe1811c01fe1c75e1c95b58cd3efdb53aced3446390101945546e585fe5e5e351df74a95bb89fee3412e912c900\"\n   },\n   \"shareid\": \"06bcfdbe7e0d2cbb\",\n   \"req_time\": 1701315426\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"0\"\n }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#list-shared-files","title":"List shared files","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestlistshare","title":"user_requestListShare","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_10","title":"Parameters","text":"name type comment page number the list is paginated. Page number start from 0. req_time number the epoch time when this request is made signature object signature on this message

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_8","title":"Returns","text":"name type comment return string negative: errors; \"0\": success; other values: invalid fileinfo array list of shared files

In fileinof, these objects are included

name type comment filesize number size of the file, in byte filehash string file hash to identify the file 1 filename string name of the file linktime number unix epoch time when the file started being shared linktimeexp number unix epoch time when file share is expired shareid string a uniq identifier for this sharing sharelink string the link for accessing this shared file"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_9","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestListShare\",\n \"params\": [\n  {\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"e176392ac2d195d0e5b1510463ce1d2a13c338b5ed7311e5da9f2252de39c4f91ab4444f0bb24fb8ea77fd33ef972706cc7945adbf9580f77cedbac65df03ea701\"\n   },\n   \"page\": 0,\n   \"req_time\": 1701315596\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"0\",\n  \"fileinfo\": [\n   {\n    \"filehash\": \"v05ahm51buqelg70rjmcbqtn2qijc7um0ds1oedo\",\n    \"filesize\": 10000000,\n    \"filename\": \"file2_10M_jan20\",\n    \"linktime\": 1675051834,\n    \"linktimeexp\": 1675055434,\n    \"shareid\": \"23929411ce338824\",\n    \"sharelink\": \"udixcc_23929411ce338824\"\n   },\n   {\n    \"filehash\": \"v05ahm51buqelg70rjmcbqtn2qijc7um0ds1oedo\",\n    \"filesize\": 10000000,\n    \"filename\": \"file2_10M_jan20\",\n    \"linktime\": 1675051919,\n    \"linktimeexp\": 1675055519,\n    \"shareid\": \"76d88022afb10203\",\n    \"sharelink\": \"OqhU3X_76d88022afb10203\"\n   },\n   {\n    \"filehash\": \"v05ahm51buqelg70rjmcbqtn2qijc7um0ds1oedo\",\n    \"filesize\": 10000000,\n    \"filename\": \"file2_10M_jan20\",\n    \"linktime\": 1675051426,\n    \"linktimeexp\": 1690603426,\n    \"shareid\": \"9025a905e28fe791\",\n    \"sharelink\": \"UfBayn_9025a905e28fe791\"\n   }\n  ],\n  \"totalnumber\": 3\n }\n}\n

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#download-a-shared-file","title":"Download a Shared File","text":"

There are for methods to be used to download a shared file.

  • user_requestGetShared: get information of shared file
  • user_requestDownloadShared: similar to user_requestDownload method for downloading a file, start downloading the shared file
  • user_downloadData: same method used for downloading a file, downloading a piece of file data
  • user_downloadedFileInfo: same method used for downloading a file, requesting file verification
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestgetshared","title":"user_requestGetShared","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_11","title":"Parameters","text":"name type comment sharelink string link for accessing this shared file req_time number the epoch time when this request is made signature object signature on this message

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_9","title":"Returns","text":"name type comment return string negative: errors; \"4\": got shared file info; other values: invalid reqid string to identify download instances when multiple download happen at same time filehash string file hash to identify a file sequencenumber string a sequence number to be used in uploading a file"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_10","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestGetShared\",\n \"params\": [\n  {\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"3e43680bb6b801a7847652aaaddf0efeda6f3c73382b1a4aea63388b1f17fe9468998172e5b00fbeb8e5c6f3d35ecfe02d4101dca17628423518e69b29a5470100\"\n   },\n   \"sharelink\": \"eozCrm_014cc2f5388a911c\",\n   \"req_time\": 1701315818\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"4\",\n  \"reqid\": \"31d1e975-cd8b-4631-8185-bee592ca3e34\",\n  \"filehash\": \"v05j1m571efv3vuk3tq7airrfglanjvts4jrd4l8\",\n  \"sequencenumber\": \"SN:0000000000000000001\"\n }\n}\n
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestdownloadshared","title":"user_requestDownloadShared","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_12","title":"Parameters","text":"name type comment filehash string file hash to identify a file 1 reqid string the same reqid get from response of user_requestGetShared req_time number the epoch time when this request is made signature object signature on this message

Object signature

name type comment address string wallet address of the user account pubkey string public key of wallet address signature string signed on a message 23"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_10","title":"Returns","text":"name type comment return string negative: errors; \"4\": got shared file info; other values: invalid reqid string to identify download instances when multiple download happen at same time offsetstart number the offset of beginning of the piece of file data, inclusive offsetend number the offset of end of the piece of file data, exclusive filename string the name of the file filedata string data of the piece of the file 4"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#example_11","title":"Example","text":"

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestDownloadShared\",\n \"params\": [\n  {\n   \"filehash\": \"v05j1m571efv3vuk3tq7airrfglanjvts4jrd4l8\",\n   \"signature\": {\n    \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n    \"pubkey\": \"stpub1q0ska45w724dy0n0jujuqcvn2c80fa9c69dth0v9flacxrxp7w2rsncclps\",\n    \"signature\": \"2b68b0d3ddc981ba8b7e366e90901fe57cd1ef7b3caea4afb0eb8588b3025fe843c35ddf26ecf1a0cece5d48c633c7b9cd84c6311452d0e1c075f5ab030e773600\"\n   },\n   \"reqid\": \"31d1e975-cd8b-4631-8185-bee592ca3e34\",\n   \"req_time\": 1701315818\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"2\",\n  \"reqid\": \"e59fb32c-0579-4762-9edf-89f71a17a60b\",\n  \"offsetstart\": 0,\n  \"offsetend\": 3145728,\n  \"filename\": \"test_10m\",\n  \"filedata\": \"xfYRzYszM+NbWW/nZJZqmI8W9aGlaFt7SBkkuL5nkx/5LGjc9aKNXsyNxloYrgs30B4KmG2uDZWvS803FPxjzbOHvs7dNu3ZZQxf7yrKeDxQB1lL2n ... \"\n }\n}\n
"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestdownloaddata","title":"user_requestDownloadData","text":"

Please see same method under section Download a File

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_downloadedfileinfo_1","title":"user_downloadedFileInfo","text":"

Please see same method under section Download a File

"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#get-ozone-balance","title":"Get Ozone Balance","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#user_requestgetozone_2","title":"user_requestGetOzone","text":""},{"location":"docs-resource-node/sds-rpc-for-file-operation/#parameters_13","title":"Parameters","text":"name type comment walletaddr string wallet address of the user account"},{"location":"docs-resource-node/sds-rpc-for-file-operation/#returns_11","title":"Returns","text":"name type comment return string negative: errors; \"0\": got shared file info; other values: invalid ozone string value of ozone balance sequencynumber string a sequence number to be used in uploading a file #### Example

Request

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"user_requestGetOzone\",\n \"params\": [\n  {\n   \"walletaddr\": \"st19nn9fnlzkpm3hah3pstz0wq496cehclpru8m3u\"\n  }\n ]\n}\n

Response

{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n  \"return\": \"0\",\n  \"ozone\": \"999951054180\",\n  \"sequencynumber\": \"SN:0000000000000000001\"\n }\n}\n

  1. filehash uses Keccak-256\u00a0\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9

  2. the message for signature is [file_hash] + [walletaddr], e.g. the string of \"v05ahm52b88i4lh1epel0cmce6606duatmml4o48st19nn9fnlzkpm3hah3pstz0wq496cehclpru8m3u\" when file hash is \"v05ahm52b88i4lh1epel0cmce6606duatmml4o48\" and wallet address is \"st19nn9fnlzkpm3hah3pstz0wq496cehclpru8m3u\"\u00a0\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9

  3. after getting signed, the signature bytes are encoded into hex string.\u00a0\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9\u21a9

  4. data is encoded using standard Base64 as defined in RFC 4648.\u00a0\u21a9\u21a9\u21a9\u21a9

  5. smd://[owner wallet address]/[file hash]\u00a0\u21a9

"},{"location":"docs-resource-node/sds-update-v12/","title":"SDS Update to v12","text":""},{"location":"docs-resource-node/sds-update-v12/#introduction","title":"Introduction","text":"

SDS v12 is a mandatory update, if you run a SDS node for Stratos, you have to apply this update in order for your node to continue normal operations.

v12 brings a large number of updates and new features. See Changelog for detailed info.

"},{"location":"docs-resource-node/sds-update-v12/#stop-node","title":"Stop node","text":"

First of all, you should stop the ppd executable. Either press Ctrl + C in the running tmux, or simply run:

kilall -2 ppd\n
"},{"location":"docs-resource-node/sds-update-v12/#compile-new-binary","title":"Compile new binary","text":"
  • Remove the existing directory (if existing):
cd $HOME\nrm -rf sds\n
  • Get the new release
git clone https://github.com/stratosnet/sds.git\ncd sds\ngit checkout tags/v0.12.0\ngo clean -modcache\nmake build\n
"},{"location":"docs-resource-node/sds-update-v12/#replace-existing-binary","title":"Replace existing binary","text":"

If you followed the full guide, you should have your ppd binary installed in $HOME/bin/ppd so we need to replace it with the new one:

cd $HOME\ncp sds/target/* $HOME/bin/\n
"},{"location":"docs-resource-node/sds-update-v12/#test-new-version","title":"Test new version","text":"

Make sure the newly installed ppd binary is up to date:

ppd version\n
Should return: v0.12.0

"},{"location":"docs-resource-node/sds-update-v12/#edit-config-file","title":"Edit config file","text":"

There are 2 ways to update the existing config file: Automatically or Manually.

The recommended way is to update it automatically. But, if for any reason, the automatic method fails, you can update your config file manually.

"},{"location":"docs-resource-node/sds-update-v12/#automatically","title":"Automatically","text":"
  • Enter your node folder. Eg:
cd $HOME\ncd sds1\n
  • Run the config update command:
ppd config update\n

Expected output:

[INFO] config.go:122: Updated config version from v0.11.9 to v0.12.0\n[INFO] config.go:128: Deleted entry node.auto_start = true\n[INFO] config.go:128: Deleted entry node.connectivity.allow_owner_rpc = false\n[INFO] config.go:135: Added entry keys.beneficiary_address =\n[INFO] config.go:135: Added entry node.connectivity.rpc_namespaces = user\n
"},{"location":"docs-resource-node/sds-update-v12/#manually","title":"Manually","text":"
  • Enter your node folder. Eg:
cd $HOME\ncd sds1\n
  • Open your node config file:
nano config/config.toml\n
  • Find the lines in red and edit them as shown in green:

app_ver = 11 app_ver = 12

min_app_ver = 11 min_app_ver = 12

show = 'v0.11.9 show = 'v0.12.0'

gas_adjustment = 1.3 gas_adjustment = 1.5

allow_owner_rpc = false rpc_namespaces = 'user'

  • Add the following lines:

After

wallet_password = ''\n

Add:

# Address for receiving reward. Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nbeneficiary_address = 'st1kranydxr7hyjs3n4susctywrxg5v23ef60urvk'\n

beneficiary_address has been added for miners that operate multiple nodes, from multiple wallets, that would like to receive all rewards to a single wallet address. You can use the same wallet as wallet_address if you want.

  • Remove the following lines:
# Should the node start mining automatically? Eg: true\nauto_start = true\n
Example of a full config file
[version]\n# App version number. Eg: 11\napp_ver = 12\n# Network connections from nodes below this version number will be rejected. Eg: 11\nmin_app_ver = 12\n# Formatted version number. Eg: \"v0.11.0\"\nshow = 'v0.12.0'\n\n# Configuration of the connection to the Stratos blockchain\n[blockchain]\n# ID of the chain Eg: \"stratos-1\"\nchain_id = 'stratos-1'\n# Multiplier for the simulated tx gas cost Eg: 1.5\ngas_adjustment = 1.5\n# Connect to the chain using an insecure connection (no TLS) Eg: true\ninsecure = false\n# Network address of the chain grpc Eg: \"127.0.0.1:9090\"\ngrpc_server = 'grpc.thestratos.org:443'\n\n# Structure of the home folder. Default paths (eg: \"./storage\" become relative to the node home. Other paths are relative to the working directory\n[home]\n# Key files (wallet and P2P key). Eg: \"./accounts\"\naccounts_path = '/home/user/sds1/accounts'\n# Where downloaded files will go. Eg: \"./download\"\ndownload_path = '/home/user/sds1/download'\n# The list of peers (other sds nodes). Eg: \"./peers\"\npeers_path = '/home/user/sds1/peers'\n# Where files are stored. Eg: \"./storage\"\nstorage_path = '/home/user/sds1/storage'\n\n[keys]\n# Address of the P2P key. Eg: \"stsdsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\np2p_address = 'stsds1exampleexampleexampleexample'\np2p_password = '1'\n# Address of the stratos wallet. Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nwallet_address = 'st1exampleexampleexampleexample'\nwallet_password = '1'\n# Address for receiving reward. Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nbeneficiary_address = 'st1exampleexampleexampleexample'\n\n# Configuration of this node\n[node]\n# Should debug info be printed out in logs? Eg: false\ndebug = true\n# When not 0, limit disk usage to this amount (in megabytes) Eg: 7629394 = 8 * 1000 * 1000 * 1000 * 1000 / 1024 / 1024  (8TB)\nmax_disk_usage = 7629394\n\n[node.connectivity]\n# Is the node running on an internal network? Eg: false\ninternal = false\n# IP address of the node. Eg: \"127.0.0.1\"\nnetwork_address = '12.13.14.15'\n# Main port for communication on the network. Must be open to the internet. Eg: \"18081\"\nnetwork_port = '18081'\n# Port for prometheus metrics\nmetrics_port = '18152'\n# Port for the JSON-RPC api. See https://docs.thestratos.org/docs-resource-node/sds-rpc-for-file-operation/\nrpc_port = '18252'\n# Namespaces enabled in the RPC API. Eg: \"user,owner\"\nrpc_namespaces = 'user'\n\n# The first meta node to connect to when starting the node\n[node.connectivity.seed_meta_node]\np2p_address = 'stsds1twy3wslrwmpkshx5fps6ysmqx5lc09p0ukurgf'\np2p_public_key = 'stsdspub1xtewcceylwekj78qwyvvpp3ms8ku44ksxkcxhhw9c4vz9xtfu2yq2l4am7'\nnetwork_address = '34.82.187.241:8888'\n\n# Configuration for the monitor server\n[monitor]\n# Should the monitor server use TLS? Eg: false\ntls = false\n# Path to the TLS certificate file\ncert_file_path = ''\n# Path to the TLS private key file\nkey_file_path = ''\n# Port used for the monitor websocket connection. It's the monitor UI that uses this port, not the person accessing the UI in a browser\nport = '18352'\n# List of IPs that are allowed to connect to the monitor websocket port. This is used to decide which IP can connect their monitor to the node, NOT to decide who can view the monitor UI page.\nallowed_origins = ['localhost']\n\n# Configuration for video streaming\n[streaming]\n# Port for the internal HTTP server\ninternal_port = '18452'\n# Port for the REST server\nrest_port = '18552'\n\n[traffic]\n# Interval at which traffic is logged (in seconds) Eg: 10\nlog_interval = 10\n# Max number of concurrent network connections. Eg: 1000\nmax_connections = 1000\n# Max number of download messages received per second (per connection). 0 Means unlimited. 1000 \u2248 1MB/sec. Eg: 1000\nmax_download_rate = 0\n# Max number of upload messages sent per second (per connection). 0 Means unlimited. 1000 \u2248 1MB/sec. Eg: 1000\nmax_upload_rate = 0\n\n# Configuration for the web server (when running sdsweb)\n[web_server]\n# Location of the web server files Eg: \"./web\"\npath = '/home/user/sds1/web'\n# Port where the web server is hosted with sdsweb. If the port is opened and token_on_startup is true, anybody who loads the monitor UI will have full access to the monitor\nport = '18652'\n# Automatically enter monitor token when opening the monitor UI. This should be false if the web_server port is opened to internet and you don't want public access to your node monitor'\ntoken_on_startup = false\n
"},{"location":"docs-resource-node/sds-update-v12/#start-the-node","title":"Start the node","text":"

You can now restart your ppd binary as explained in the full guide.

"},{"location":"docs-resource-node/sds-video-streaming-handbook/","title":"SDS Video Stream Handbook","text":""},{"location":"docs-resource-node/sds-video-streaming-handbook/#video-file-upload-in-hls-format","title":"Video file upload in HLS format","text":"

Streaming is the continuous transmission of audio or video files(media files) from a server to a client.

SDS supports uploading mp4 video file in Apple\u2019s HLS (Http live streaming) format and can be later streamed back to the video player.

"},{"location":"docs-resource-node/sds-video-streaming-handbook/#upload-streaming-file","title":"Upload streaming file","text":"

There are two ways of uploading file, via command line tool or remote RPC api call. Please note that once a video file is uploaded via this command in streaming format, it is not allowed to be downloaded via regular get command in the current version. Instead, it has to be played through the APIs that are designed for playing streaming videos.

"},{"location":"docs-resource-node/sds-video-streaming-handbook/#requirements","title":"Requirements","text":"
  1. To upload video in streaming format, a SDS resource node needs to be set up and has to join the SDS. For detailed guideline on how to set up a resource node, please refer to Setup and run a SDS Resource Node.
  2. It is also required to install a tool ffmpeg for transcoding multimedia files.

In Linux Terminal:

sudo apt update\nsudo apt install ffmpeg\n\n# use ffmpeg -version to check its version\nffmpeg -version\n

In MacOS Terminal:

brew update\nbrew install ffmpeg\n
"},{"location":"docs-resource-node/sds-video-streaming-handbook/#upload-via-command-line-tool-ppd-terminal","title":"Upload via command line tool ppd terminal","text":"

In order to upload video stream by command line tool, you need to open A NEW COMMAND-LINE TERMINAL, and enter the root directory of the same resource node.

Then, use ppd terminal commands to start the interaction with resource node.

# Open a new command-line terminal\n# Make sure we are inside the root directory of the same resource node\ncd rsnode\n\n# Interact with resource node through a set of \"ppd terminal\" subcommands\nppd terminal\n

Now, we can use the subcommand putstream to upload a media file

putstream <filepath>\n

filepath is the absolute path of the file to be uploaded, or a relative path starting from the root directory of the resource node.

Example:

putstream example_01.mp4\n

"},{"location":"docs-resource-node/sds-video-streaming-handbook/#upload-via-sds-rpc-client","title":"Upload Via SDS RPC client","text":"

Media file can be uploaded in streaming format also via remote rpc call. For details regarding launching RPC client, please refer to the RPC client doc.

putstream is the command to be used for uploading media file in streaming format.

Usage:\n  rpc_client putstream <filepath> [flags]\n\nFlags:\n  -h, --help   help for putstream\n\nGlobal Flags:\n  -u, --url string      url to the RPC server, e.g. http://3.24.59.6:8235 (default \"http://127.0.0.1:4444\")\n  -w, --wallet string   wallet address to be used (default: the first wallet in folder ./account/)\n

Example:

rpc_client putstream /home/user/tmp/file_example_MP4_640_3MG.mp4 \\\n--url http://127.0.0.1:4444 \\\n--wallet st14rhrt576gvj6cl46tjn4pctghllmn63tm69e72\n
"},{"location":"docs-resource-node/sds-video-streaming-handbook/#play-and-cache-the-video-streaming-file","title":"Play and cache the video streaming file","text":""},{"location":"docs-resource-node/sds-video-streaming-handbook/#requirements_1","title":"Requirements","text":"

To play and cache the video steaming file, the resource node has to be a non-active resource node.

"},{"location":"docs-resource-node/sds-video-streaming-handbook/#play-the-cache-the-video-streaming-file","title":"Play the cache the video streaming file","text":"

To stream the video, we use the videojs as the player in the front-end template html file , however, any player that can play the HLS format file could be used. The way how the hls video streaming works with videojs, is to put the api url that gets the .m3u8 file as the source and put application/x-mpegURL as the type. Then the player will call the same url automatically with different url parameter to fetch video segment according to the metadata stored in .m3u8 file. Once the client initiates a request to play the video file, the full fee is charged and the resource node also starts caching the whole streaming file on the local disk. Once the whole file is cached, the next play of the video will not download the file again from the SDS and no fee will be charged.

Steps:

  1. Launch the non-active resource node and connects it to the SDS system
  2. Open the template html file in a text editor and replace the following variables in the template file
  3. url - the url to the resource node server
  4. internalPort - corresponds to the internal_port in the config of pp node
  5. fileHash - file hash of the video file to be played
  6. ownerWalletAddress - wallet address which owns the video file
  7. Open the template html file again in chrome, and it will start playing the video.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/","title":"Setup and run a SDS Resource Node","text":"

The Stratos Decentralized Storage (SDS) network is a scalable, reliable, self-balancing elastic acceleration network. We can simply take it as a decentralized file system suitable for running on general-purpose hardware.

SDS is composed of many Resource Nodes that store data, and a few Meta Nodes that coordinate with each other.

Note that provides their resource(disk/bandwidth/computation power) for SDS is called Resource Node.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#requirements","title":"Requirements","text":"
  • Minimum Hardware Requirements
Type CPU RAM Storage Bandwidth Deposit TIER 1 8 Cores\u00b9, 2.5GHz\u00b2 16 GB 4 TB Up: 50Mbps Down: 100Mbps 800 STOS TIER 2 16 Cores\u00b9, 2.5GHz\u00b2 32 GB 8 TB Up: 100Mbps Down: 100Mbps 1600 STOS TIER 3 32 Cores\u00b9, 2.5GHz\u00b2 64 GB 16 TB Up: 1Gbps Down 1Gbps 3200 STOS

\u00b9 \u00a0\u00a0 Can be achieved using dual CPU server configurations (eg. 2cpu x 4cores, 2cpu x 8cores, etc, as long as the frequency per core is respected). \u00b2 \u00a0\u00a0 2.5GHz refers to Base Frequency, not Turbo/Boost Frequency.

  • Software(tested version)

    • Ubuntu 18.04+
    • Go 1.19 - 1.22 linux/amd64
"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#keywords","title":"Keywords","text":"

There are some keywords that are widely used in SDS. We describe them as

  • resource node(PP node): Node that participates in the Stratos Resource Network by providing their disk/bandwidth/computation power to earn rewards in the Proof-of-Traffic(PoT) model.

  • meta node(SP nodes): Node that manages the tasks in the Resource Network between resource nodes, including indexing all content, auditing the traffic report and communicating between Resource Network and Stratos-chain through a relay mechanism.

  • active resource node: A resource node that has been activated by depositing to the Stratos-chain and registering to a meta node. It is ready to receive tasks assigned by the meta node.

  • suspended resource node: A resource node that has not satisfied the performance KPI evaluation criteria and is suspended from receiving further tasks from the meta node.

  • traffic: The data volume evaluated in the Resource Network. The incentive for all participants in the Stratos Ecosystem is based on traffic.

  • STOS(Stratos Tokens): The native token facilitating value circulation in Stratos Ecosystem.

  • ozone(oz): The traffic unit used in Stratos Ecosystem.

  • epoch: The Proof-of-Traffic evaluation periodic window. The traffic for the Resource Network is evaluated at the end of each epoch.

  • value network: The Stratos-chain, the network that circulates all values in the Stratos Ecosystem.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#setup-environment","title":"Setup Environment","text":"

Tip

In order to run an SDS resource node, you need to build SDS source code which requires Go 1.19+, git, curl and make installed.

If you have installed them previously, just skip this section. Otherwise, please install them as the following

This process depends on your operating system.

  • Linux Users

The following example is based on Ubuntu 18.04+ 64-bit(Debian) and assumes you are using a terminal environment by default. Please run the equivalent commands if you are running other Linux distributions.

# Update the system\nsudo apt update\nsudo apt upgrade\n\n# Install git, snap and make(you can also install them separately as your needs)\nsudo apt install git build-essential curl tmux --yes\n\n# Prepare binary PATH:\nmkdir ~/bin\necho 'export PATH=\"$HOME/bin:$PATH\"' >> ~/.profile\nsource ~/.profile\n

To install Go 1.22, please follow these steps:

# If you already have Go installed, check with\ngo version\n\n# If you have 1.18 or older, remove it using the same method you installed with. For example:\nsudo snap remove go\nsudo apt remove golang-go\n

Install Go 1.22:

# Do a clean-up:\nsudo rm -rf /usr/local/go\n\n# Download the Go Binary Package:\nwget https://go.dev/dl/go1.22.3.linux-amd64.tar.gz\n\n# Unzip it to /usr/local directory:\nsudo tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz\n\n# Add the Go PATH:\necho 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile\nsource ~/.profile\n\n# Verify with\ngo version\n\n# You should see:\n# go version go1.22.3 linux/amd64\n

  • Windows Users

It is possible to build and run the software on Windows. However, we did not test it on Windows completely. It may give you unexpected results, or it may require additional setup.

An alternative option is to install a separate virtual Linux system using VirtualBox or VMware Workstation

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#compile-sds-resource-node","title":"Compile SDS resource node","text":"
  • Compile the binary executables with source code
git clone https://github.com/stratosnet/sds.git\ncd sds\ngit checkout tags/v0.12.0\nmake build\n
  • Installing the binary executable

Once the compilation is successful, you will find three binary executables (ppd, relayd, sdsweb) under the target folder. Copy them to your home binary path:

cp target/* ~/bin\n

  • Verify the installation with:
ppd version\n

You should get v0.12.0.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#create-sds-resource-node","title":"Create SDS resource node","text":""},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#create-a-root-directory","title":"Create a root directory","text":"

To start a resource node, you need to be in a directory dedicated to your resource node.

Create a new directory, or go to the root directory of your existing node.

In the following instruction, we assume you have entered the root directory of the resource node.

# create a new folder \ncd $HOME\nmkdir rsnode\n# Make sure we are inside the root directory of the resource node\ncd rsnode\n

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#configure-sds-resource-node","title":"Configure SDS resource node","text":"

Next, you need to generate the configuration file and its accounts of this resource node. The command ppd config will help you to generate necessary configurations.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#generaterecover-wallet","title":"Generate/Recover wallet","text":"

The ppd config command consists of several flags or subcommand. Let take a look at its general definition using ppd config -h.

ppd config -h\n\ncreate default configuration file\n\nUsage:\n  ppd config [flags]\n  ppd config [command]\n\nAvailable Commands:\n  accounts    create accounts for the node\n  update      update the config file to the latest version\n\nFlags:\n  -p, --create-p2p-key   create p2p key with config file, need interactive input\n  -w, --create-wallet    create wallet with config file, need interactive input\n  -h, --help             help for config\n\nGlobal Flags:\n  -c, --config string   configuration file path  (default \"./config/config.toml\")\n  -r, --home string     path for the node (default \"/root/sds10\")\n\nUse \"ppd config [command] --help\" for more information about a command.\n

Tip

There are two ways to generate a configuration file and create (or recover) a wallet:

  • Option 1 will generate a configuration file and a wallet automatically.

  • Option 2 will generate a configuration file and allow you to create or recover a wallet.

When asked to input bip39 mnemonic,

Input your mnemonic -> recovers an existing wallet account;

keep it blank -> generates a new wallet account

Usage:

# Make sure we are inside the root directory of the resource node\ncd ~/rsnode\n# to create config with interactive key creation\nppd config -w -p\n
Example (creating a new wallet account) You will get a new wallet account
# Make sure we are inside the root directory of the resource node\ncd ~/rsnode        \nppd config -w -p\n\n[INFO] setting.go:159: The config at location /home/rawl/tmp/config/config.toml does not exist\n[INFO] config.go:29: generating default config file\n[INFO] config.go:66: No wallet key specified in config. Attempting to create one...\nEnter wallet nickname: main1\nEnter password:         # choose a password\nEnter password again:   # retype the password\ninput bip39 mnemonic (leave blank to generate a new one)        # press enter\ninput hd-path for the account, default: \"m/44'/606'/0'/0/0\" :   # press enter\nsave the mnemonic phase properly for future recovery:\n=======================================================================\njunior quantum now kit gadget usage audit glide rocket tissue crawl surprise \npoint verify put virus prepare monitor electric spice tourist horror achieve poem\n=======================================================================\n\n[INFO] setup_wallet.go:62: Wallet st1na2yyucggvmjv5kmgc2jeaacpmjr6u9g7vqv32 has been generated successfully\nDo you want to use this wallet as your node wallet: Y(es)/N(o): y\n\n[INFO] common.go:162: No p2p key specified in config. Attempting to create one...\nEnter password for p2p key:         # choose a password\nEnter password for p2p key again:   # retype the password\n\nHow should the p2p key be generated?  1) From the wallet  2) From a hex-encoded private key  3) Randomly: 1\nUse the HD path (m/44'/606'/0/0) to generate the p2p key (stsds1qvsypctsdm30keudfwcmtal63dxhnfhjunxms8)? [y/N] y\n
Example (recovering an existing wallet account) You will get the same wallet account if you already have one.
# Make sure we are inside the root directory of the resource node\ncd ~/rsnode        \nppd config -w -p\n\n[INFO] setting.go:159: The config at location /home/rawl/tmp/config/config.toml does not exist\n[INFO] config.go:29: generating default config file\n[INFO] config.go:66: No wallet key specified in config. Attempting to create one...\nEnter wallet nickname: main1\nEnter password:         # choose a password\nEnter password again:   # retype the password\ninput bip39 mnemonic (leave blank to generate a new one)        # enter your 24-words seed phrase\ninput hd-path for the account, default: \"m/44'/606'/0'/0/0\" :   # press enter\nsave the mnemonic phase properly for future recovery:\n=======================================================================\njunior quantum now kit gadget usage audit glide rocket tissue crawl surprise \npoint verify put virus prepare monitor electric spice tourist horror achieve poem\n=======================================================================\n\n[INFO] setup_wallet.go:62: Wallet st1na2yyucggvmjv5kmgc2jeaacpmjr6u9g7vqv32 has been generated successfully\nDo you want to use this wallet as your node wallet: Y(es)/N(o): y\n\n[INFO] common.go:162: No p2p key specified in config. Attempting to create one...\nEnter password for p2p key:         # choose a password\nEnter password for p2p key again:   # retype the password\n\nHow should the p2p key be generated?  1) From the wallet  2) From a hex-encoded private key  3) Randomly: 1\nUse the HD path (m/44'/606'/0/0) to generate the p2p key (stsds1qvsypctsdm30keudfwcmtal63dxhnfhjunxms8)? [y/N] y\n

Note

When you enter your seed phrase, it will not be shown as a security measure.

When generating the p2p key, option 1) will generate the same p2p address for the existing wallet, every time.

If you want to run multiple nodes on the same wallet address, choose option 3).

Alternatively, you can use unique wallets and unique p2p addresses, but a single beneficiary_address where all the rewards will be gathered to.

It's just a matter of personal preference.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#directory-structure","title":"Directory structure","text":"

After the above command executed successfully, Your rsnode folder should include directories and files similar to the following.

.\n\u251c\u2500\u2500 accounts\n\u2502   \u251c\u2500\u2500 st10t5chdnhx6myggwwhfq7q39hnjhzapau9yy6tv.json\n\u2502   \u2514\u2500\u2500 stsds1hez7aewx6srjtrw3064w3qy4dk22uv0cx7jxww.json\n\u2502\u2500\u2500 config\n\u2502   \u2514\u2500\u2500 config.toml\n\u2514\u2500\u2500 tmp\n  \u2514\u2500\u2500 logs\n      \u2514\u2500\u2500 stdout.log\n

accounts folder keeps important account info, including the Wallet Address(starting with st) and P2P Address(starting with stsds) of your SDS resource node.

configs folder includes all configurations for this SDS resource node. User may need to modify configs/config.toml file to adapt to specific requirements of the network.

tmp folder is hols the logs and outputs.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#edit-configuration-file","title":"Edit configuration file","text":"

You will need to edit a few lines in the file configs/config.toml to setup your node.

Open config file and make the following modifications:

nano config/config.toml\n

\u270f\ufe0f - Edit your external ip address:

Replace 99.99.99.99 with your external ip address.

This ip address and port must be accessible from the Internet. If you are behind a router, the network_port must be forwarded.

[node.connectivity]\n# Is the node running on an internal network? Eg: false\ninternal = false\n# IP address of the node. Eg: \"127.0.0.1\"\nnetwork_address = '99.99.99.99'\n# Main port for communication on the network. Must be open to the internet. Eg: \"18081\"\nnetwork_port = '18081'\n

Tip

To find your external ip, you can run the following command in another terminal:

curl ifconfig.co\n

\u270f\ufe0f - Edit the first meta node to connect on first run: (you can skip this if you start with v0.12.0)

# The first meta node to connect to when starting the node\n[node.connectivity.seed_meta_node]\np2p_address = ''\np2p_public_key = ''\nnetwork_address = ''\n
metanode you can start with
# europe\np2p_address = 'stsds1ypxg8sj5vn4s4v0w965g4r9g3pt3vlz6wyzx0f'\np2p_public_key = 'stsdspub1y6exsr8snwz65ev3pzq6k3yfy2ku3kexqdd0en35dnr8mxc9w6sq5jg6lf'\nnetwork_address = '34.34.149.18:8888'\n\n# asia\np2p_address = 'stsds10kmygjv7e2t39f6jka6445q20e9lv4a7u3qex3'\np2p_public_key = 'stsdspub1srn3qetarx3x6f2x9wqfv3nh2aufxv03ncl5v6jkmyg666scvz6s4xgprq'\nnetwork_address = '34.85.35.57:8888'\n\n# NA\np2p_address = 'stsds1z96pm5ls0ff2y7y8adpy6r3l8jqeaud7envnqv'\np2p_public_key = 'stsdspub1lf769k20k36e4gvnewcwdtfudzj95qk45d5f0p300jmr7e6y73zsdyh25y'\nnetwork_address = '34.82.40.37:8888'\n

\u270f\ufe0f - Edit the beneficiary_address:

# Address for receiving reward. Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nbeneficiary_address = ''\n

Enter your wallet address where you want to receive your node mining rewards.

This is useful when you run multiple nodes, each with its unique operating wallet and you want to receive all the rewards in one place.

If you only have one node, you can enter here the same address as defined under wallet_address.

Example of a full config file
[version]\n# App version number. Eg: 11\napp_ver = 12\n# Network connections from nodes below this version number will be rejected. Eg: 11\nmin_app_ver = 12\n# Formatted version number. Eg: \"v0.11.0\"\nshow = 'v0.12.0'\n\n# Configuration of the connection to the Stratos blockchain\n[blockchain]\n# ID of the chain Eg: \"stratos-1\"\nchain_id = 'stratos-1'\n# Multiplier for the simulated tx gas cost Eg: 1.5\ngas_adjustment = 1.5\n# Connect to the chain using an insecure connection (no TLS) Eg: true\ninsecure = false\n# Network address of the chain grpc Eg: \"127.0.0.1:9090\"\ngrpc_server = 'grpc.thestratos.org:443'\n\n# Structure of the home folder. Default paths (eg: \"./storage\" become relative to the node home. Other paths are relative to the working directory\n[home]\n# Key files (wallet and P2P key). Eg: \"./accounts\"\naccounts_path = '/home/user/sds1/accounts'\n# Where downloaded files will go. Eg: \"./download\"\ndownload_path = '/home/user/sds1/download'\n# The list of peers (other sds nodes). Eg: \"./peers\"\npeers_path = '/home/user/sds1/peers'\n# Where files are stored. Eg: \"./storage\"\nstorage_path = '/home/user/sds1/storage'\n\n[keys]\n# Address of the P2P key. Eg: \"stsdsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\np2p_address = 'stsds1exampleexampleexampleexample'\np2p_password = '1'\n# Address of the stratos wallet. Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nwallet_address = 'st1exampleexampleexampleexample'\nwallet_password = '1'\n# Address for receiving reward. Eg: \"stxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nbeneficiary_address = 'st1exampleexampleexampleexample'\n\n# Configuration of this node\n[node]\n# Should debug info be printed out in logs? Eg: false\ndebug = true\n# When not 0, limit disk usage to this amount (in megabytes) Eg: 7629394 = 8 * 1000 * 1000 * 1000 * 1000 / 1024 / 1024  (8TB)\nmax_disk_usage = 7629394\n\n[node.connectivity]\n# Is the node running on an internal network? Eg: false\ninternal = false\n# IP address of the node. Eg: \"127.0.0.1\"\nnetwork_address = '12.13.14.15'\n# Main port for communication on the network. Must be open to the internet. Eg: \"18081\"\nnetwork_port = '18081'\n# Port for prometheus metrics\nmetrics_port = '18152'\n# Port for the JSON-RPC api. See https://docs.thestratos.org/docs-resource-node/sds-rpc-for-file-operation/\nrpc_port = '18252'\n# Namespaces enabled in the RPC API. Eg: \"user,owner\"\nrpc_namespaces = 'user'\n\n# The first meta node to connect to when starting the node\n[node.connectivity.seed_meta_node]\np2p_address = 'stsds1twy3wslrwmpkshx5fps6ysmqx5lc09p0ukurgf'\np2p_public_key = 'stsdspub1xtewcceylwekj78qwyvvpp3ms8ku44ksxkcxhhw9c4vz9xtfu2yq2l4am7'\nnetwork_address = '34.82.187.241:8888'\n\n# Configuration for the monitor server\n[monitor]\n# Should the monitor server use TLS? Eg: false\ntls = false\n# Path to the TLS certificate file\ncert_file_path = ''\n# Path to the TLS private key file\nkey_file_path = ''\n# Port used for the monitor websocket connection. It's the monitor UI that uses this port, not the person accessing the UI in a browser\nport = '18352'\n# List of IPs that are allowed to connect to the monitor websocket port. This is used to decide which IP can connect their monitor to the node, NOT to decide who can view the monitor UI page.\nallowed_origins = ['localhost']\n\n# Configuration for video streaming\n[streaming]\n# Port for the internal HTTP server\ninternal_port = '18452'\n# Port for the REST server\nrest_port = '18552'\n\n[traffic]\n# Interval at which traffic is logged (in seconds) Eg: 10\nlog_interval = 10\n# Max number of concurrent network connections. Eg: 1000\nmax_connections = 1000\n# Max number of download messages received per second (per connection). 0 Means unlimited. 1000 \u2248 1MB/sec. Eg: 1000\nmax_download_rate = 0\n# Max number of upload messages sent per second (per connection). 0 Means unlimited. 1000 \u2248 1MB/sec. Eg: 1000\nmax_upload_rate = 0\n\n# Configuration for the web server (when running sdsweb)\n[web_server]\n# Location of the web server files Eg: \"./web\"\npath = '/home/user/sds1/web'\n# Port where the web server is hosted with sdsweb. If the port is opened and token_on_startup is true, anybody who loads the monitor UI will have full access to the monitor\nport = '18652'\n# Automatically enter monitor token when opening the monitor UI. This should be false if the web_server port is opened to internet and you don't want public access to your node monitor'\ntoken_on_startup = false\n

You can save and close the config file with Ctrl + X.

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#run-sds-resource-node","title":"Run SDS resource node","text":"

After setting up configuration properly, filled your wallet with STOS, you can now start your resource node.

# Node executable must be running in background at all times \n# so it's recommended to start a tmux window first:\ntmux new -s rsnode\n\n# Make sure you are inside the root directory of the resource node\ncd ~/rsnode\n\n# start the resource node\nppd start\n
"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#registration-and-activation","title":"Registration and Activation","text":"

In order to interact with the resource node, you need to open A NEW COMMAND-LINE TERMINAL, and enter the root directory of the same resource node.

Then, use ppd terminal commands to start the interaction with resource node.

All ppd sub-commands should be executed in this ppd terminal.

# Open a new command-line terminal\n# Make sure we are inside the root directory of the same resource node\ncd ~/rsnode\n\n# Interact with resource node through a set of \"ppd terminal\" sub-commands\nppd terminal\n

  • Registering the resource node to a meta node

The resource node(PP) should be registered to a meta node(SP) before doing anything else.

In ppd terminal, input one of the two following identical sub-commands:

rp\n\n# or\n\nregisterpeer\n

  • Activating the resource node with deposit

You can activate your resource node for a specific TIER.

Choose the amount based on the tier you want to run on.

Tier Amount Tier 1 800 STOS Tier 2 1600 STOS Tier 3 3200 STOS

After it is activated successfully, your resource node starts to receive tasks from meta nodes and thus gaining mining rewards accordingly.

activate <amount> <fee> [gas] \n

amount is the amount of tokens you want to deposit. 1stos = 10^9gwei = 10^18wei.

fee is the amount of tokens to pay as a fee for the activation transaction. 10000wei would work. It will use default value if no fee amount is provided.

gas is the amount of gas to pay for the transaction. 1000000 would be a safe number. It will use default value if no gas amount is provided.

Example:

activate 1600stos 0.01stos\n
  • Start Mining

You should run this command:

  1. After new node is activated

  2. After node is unsuspended

Run the following command in ppd terminal:

startmining\n
  • Verify Activation Status

Run the following command in ppd terminal:

status\n

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#check-resource-node-status","title":"Check resource node status","text":"

There are a set of Restful APIs to check resource node status and Proof of Traffic(PoT) rewards.

You can input the following APIs in an explorer directly. We list some of them here and more details as well as examples can be found in Stratos Chain REST APIs

Check node registration status(register module)

  • Query total deposit state of all registered resource nodes and meta nodes
https://rest.thestratos.org/stratos/register/v1/deposit_total\n

  • Query params of register module
https://rest.thestratos.org/stratos/register/v1/params\n

  • Get all deposit info of a specific owner
https://rest.thestratos.org/stratos/register/v1/deposit_by_owner/{owner wallet address}\n

  • Get info of a registered resource node
https://rest.thestratos.org/stratos/register/v1/resource_node/{resource node network address}\n

  • Get info of a registered meta node
https://rest.thestratos.org/stratos/register/v1/meta_node/{meta node network address}\n

  • Get total number of registered resource nodes
https://rest.thestratos.org/stratos/register/v1/resource_node_count\n

  • Get total number of registered meta nodes
https://rest.thestratos.org/stratos/register/v1/meta_node_count\n

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#check-pot-rewards","title":"Check PoT rewards","text":"
  • Query PoT rewards of a wallet_address at a specific epoch
https://rest.thestratos.org/stratos/pot/v1/rewards/wallet/{wallet_address}/epoch/{epoch}\n
  • Query current Pot rewards of a wallet_address
https://rest.thestratos.org/stratos/pot/v1/rewards/wallet/{wallet_address}\n
  • Query owner's Pot slashing info at a specific height
https://rest.thestratos.org/stratos/pot/v1/slashing/{wallet_address}\n
  • Check SDS prepay and Ozone(SDS module)

  • Get a simulated prepay result

https://rest.thestratos.org/stratos/sds/v1/sim_prepay/<amount of `wei` to prepay>\n

  • Get current nozPrice

https://rest.thestratos.org/stratos/sds/v1/noz_price\n

  • Get current nozSupply
https://rest.thestratos.org/stratos/sds/v1/noz_supply\n

"},{"location":"docs-resource-node/setup-and-run-a-sds-resource-node/#other-ppd-terminal-commands","title":"Other ppd terminal commands","text":"

Please refer to ppd terminal subcommands for more details.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/","title":"HowTo Become a Validator","text":"

Stratos Chain is based on Tendermint, which relies on a set of validators to secure the network.

This document explains how to become a validator step by step.

In testing phase, the mechanisms and values are subject to change.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#what-is-a-validator","title":"What is a Validator?","text":"

Info

The role of validators is to run a full-node and participate in consensus by broadcasting votes which contain cryptographic signatures signed by their private key.

Validators commit new blocks in the blockchain and receive revenue in exchange for their work.

They must also participate in governance by voting on proposals.

Validators are weighted according to their total stake.

A full-node is a program that fully validates transactions and blocks of a blockchain. In practice, running a full node implies running a non-compromised and up-to-date version of the software with low network latency and with no downtime.

The weight(i.e. voting power) of a validator is determined by the total amount of staking tokens(STOS) bonded as collateral. These bonded staking tokens can be self-delegated directly by the validator or delegated to the validator by any tokens holders(delegators). Not all the validator candidates will actively participate in block processing. Currently, only the most staked 100 validators, sorted by their weight(voting power), will be in the active list and thus gain block rewards.

If the active validators double sign, are frequently offline or do not participate in governance, their staked tokens will be slashed as penalty, which depends on the severity of the violation.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#becoming-a-validator","title":"Becoming a validator","text":"

In order to become a validator, First you have installed and run a Stratos-chain full-node. You can setup your full-node if you haven't yet.

The following instructions assume you have successfully run a Stratos-chain full-node and followed our instructions by default.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#connect-to-stratos-chain-testnet","title":"Connect to Stratos-chain Testnet","text":"

Please refer to full-node setup guide to:

download related files

start your Stratos-chain full-node and catch up to the latest block height(synchronization)

create your Stratos-chain Wallet

Faucet or send an amount of tokens to this wallet

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#directory-structure","title":"Directory Structure","text":"

After the node has finished sync, your Stratos-chain wallet has been created and charged with an amount of tokens, $HOME directory will have a .stchaind directory.

.\n\u251c\u2500\u2500 config\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 addrbook.json\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 app.toml\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.toml\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.toml\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 genesis.json\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 node_key.json\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 priv_validator_key.json\n\u251c\u2500\u2500 data\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 application.db\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 blockstore.db\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 priv_validator_state.json\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 snapshots\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 state.db\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 tx_index.db\n\u2514\u2500\u2500 keyring-test\n    \u251c\u2500\u2500 6894f6eef2b730a5f071eed1f3aeb471dfeeeaaf.address\n    \u251c\u2500\u2500 d6052b289b78468612a8f97cf59eac184ba852dd.address\n    \u251c\u2500\u2500 d704353fe67f948c99d2e3105adc5159c9e8f2af.address\n    \u251c\u2500\u2500 f07ab66406c02aa1a398f4fa41a91192fae08997.address\n    \u251c\u2500\u2500 fdb03146cb5a83e08785e8d1f083132d4386b4bd.address\n    \u251c\u2500\u2500 user0.info\n    \u251c\u2500\u2500 user10.info\n    \u251c\u2500\u2500 user1.info\n    \u251c\u2500\u2500 user2.info\n    \u2514\u2500\u2500 user3.info\n

Tip

By default, the .stchaind have been saved or created under the $HOME folder. If you are not sure what is your $HOME folder, in terminal, use echo $HOME to check.

In config folder:

  • addrbook.json stores peer addresses.
  • app.toml contains the default settings required for app.
  • config.toml contains various options pertaining to the stratos-chain configurations.
  • genesis.json defines the initial state upon genesis of stratos-chain.
  • node_key.json contains the node private key and should thus be kept secret.
  • priv_validator_key.json contains the validator address, public key and private key, and should thus be kept secret.

In data folder:

  • All *.db folders are Tendermint databases
  • Tendermint uses a write ahead log (WAL) for consensus
  • priv_validator_state.jsonholds the validator's state

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#check-your-wallet-account-balance-and-account-type","title":"Check your wallet account balance and account type","text":"
stchaind query bank balances st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\nbalances:\n- amount: \"499999996283820000000\"\n  denom: wei\npagination:\n  next_key: null\n  total: \"0\"\n
stchaind query account st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n|\n'@type': /cosmos.auth.v1beta1.BaseAccount\naccount_number: \"0\"\naddress: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\npub_key:\n  '@type': /stratos.crypto.v1.ethsecp256k1.PubKey\n  key: Agkwb1xacHBqeqGBIqRacXgf0qKTnEBPCEtH2vTE01Ke\nsequence: \"4\"\n
"},{"location":"docs-stratos-chain/how-to-become-a-validator/#get-a-new-validators-pubkey","title":"Get a new validator's pubkey","text":"

Validators are actors on the network committing new blocks by submitting their votes. It refers to the node itself, not a single person or a single account. In Stratos-chain, The protocol requires a fixed known set of validators, where each validator is identified by their public key. To get the node public key, run the following command under your node folder.

# Make sure we are inside the home directory\ncd $HOME\nstchaind tendermint show-validator\n\n# expected output\n{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\"}\n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#create-a-new-validator","title":"Create a new validator","text":"

A validator can be crested by sending a create-validator transaction command

DON'T USE MORE STAKING TOKEN THAN YOU HAVE

Where:

  • pubKey: The private key associated with this Tendermint PubKey is used to sign prevotes and precommits. Got form step4
  • moniker: the validator's name, which is going to be the public name associated to your validator that can easily identify you among all the other validators.
  • website: website(Optional)
  • description: description(Optional)
  • commission-rate: The commission rate on block rewards and fees charged to delegators
  • commission-max-rate: The maximum commission rate which this validator can charge. 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. This flags cannot be changed after create-validator is processed
  • commission-max-change-rate: The maximum daily increase of the validator commission. This flags cannot be changed after create-validator is processed
  • min-self-delegation: Minimum amount of tokens the validator needs to have bonded at all time. It is a strictly positive integer that represents the minimum amount of self-delegated staking token your validator must always have. A validator with a self delegation lower than this number will automatically be unbonded.
  • amount: the amount to delegate, the minimum amount of tokens that must be delegated to be a bonded validator is \"1\".
  • from: the wallet address that the delegation amount come from.
  • the current chain-id is mesos-1 for Testnet and stratos-1 for Mainnet
  • on Testnet, --keyring-backend=test
  • on Mainnet, --keyring-backend=file|os|pass. You must use the same one you used when creating the wallet in previous guide (Setup Full-Chain Node).

Example:

stchaind tx staking create-validator \\\n--amount=100stos \\\n--pubkey='{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"JwtmYzaX0b+zjuDypUI2+qy8wa/LFtUUUg0+vr11tpg=\"}' \\\n--moniker=\"myValidator\" \\\n--commission-rate=0.10 \\\n--commission-max-rate=0.20 \\\n--commission-max-change-rate=0.01 \\\n--min-self-delegation=1 \\\n--from=st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0 \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#different-validator-states","title":"Different Validator States","text":"

After a validator is created with a create-validator transaction, the validator is in one of three states:

States:

  • In validator set: Validator is in the active set and participates in consensus. Validator can be slashed for misbehavior.

  • Jailed: Validator misbehaved and is in jail.

  • Unbonded: Validator is not in the active set. Validator cannot be slashed. It is still possible to delegate tokens to an unbonded validator. Undelegating from an unbonded validator is immediate.

In the response of query staking validators command in next step, the value of jailed implies if a validator is in jail, while the value of status implies its bonding status:

  // UNSPECIFIED defines an invalid validator status.\n  BOND_STATUS_UNSPECIFIED = 0 \n  // UNBONDED defines a validator that is not bonded.\n  BOND_STATUS_UNBONDED = 1 \n  // UNBONDING defines a validator that is unbonding.\n  BOND_STATUS_UNBONDING = 2 \n  // BONDED defines a validator that is bonded.\n  BOND_STATUS_BONDED = 3 \n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#view-validatorvalidators","title":"View validator/validators","text":""},{"location":"docs-stratos-chain/how-to-become-a-validator/#view-all-validators","title":"View all validators","text":"
stchaind query staking validators\n- |\npagination:\n  next_key: null\n  total: \"0\"\nvalidators:\n- commission:\n    commission_rates:\n      max_change_rate: \"0.010000000000000000\"\n      max_rate: \"0.200000000000000000\"\n      rate: \"0.100000000000000000\"\n    update_time: \"2023-01-09T17:08:58.489050300Z\"\n  consensus_pubkey:\n    '@type': /cosmos.crypto.ed25519.PubKey\n    key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\n  delegator_shares: \"500000000000.000000000000000000\"\n  description:\n    details: \"\"\n    identity: \"\"\n    moniker: node\n    security_contact: \"\"\n    website: \"\"\n  jailed: false\n  min_self_delegation: \"1\"\n  operator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n  status: BOND_STATUS_BONDED\n  tokens: \"500000000000\"\n  unbonding_height: \"0\"\n  unbonding_time: \"1970-01-01T00:00:00Z\"\n
"},{"location":"docs-stratos-chain/how-to-become-a-validator/#view-a-specific-validator","title":"View a specific validator","text":"
stchaind query staking validator <your_validator_operator_address>\n
stchaind query staking validator stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n|\ncommission:\n  commission_rates:\n    max_change_rate: \"0.010000000000000000\"\n    max_rate: \"0.200000000000000000\"\n    rate: \"0.100000000000000000\"\n  update_time: \"2023-01-09T17:08:58.489050300Z\"\nconsensus_pubkey:\n  '@type': /cosmos.crypto.ed25519.PubKey\n  key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\ndelegator_shares: \"500000000000.000000000000000000\"\ndescription:\n  details: \"\"\n  identity: \"\"\n  moniker: node\n  security_contact: \"\"\n  website: \"\"\njailed: false\nmin_self_delegation: \"1\"\noperator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\nstatus: BOND_STATUS_BONDED\ntokens: \"500000000000\"\nunbonding_height: \"0\"\nunbonding_time: \"1970-01-01T00:00:00Z\"\n

Tip

  • As an active validator, the value of status should be BOND_STATUS_BONDED and jailed is false.

  • From all validator candidates, only the top 100 validators with the most total stake are the active validators. If a validator's total stake falls below the top 100, then that validator loses their validator privileges.

  • The validator cannot participate in consensus until the stake is high enough to be in the top 100. In Stratos Exporer, the validator is shown in inactive list, but not active list.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#validator-operations","title":"Validator Operations","text":"

We listed some examples of commonly used commands for validators

Tip

  • You may need to replace the values in these examples with your own data
  • The current chain-id can be found on the Stratos Explorer right next to the search bar at the top of the page.
  • In the testing phase, --keyring-backend=test

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#-staking-module","title":"- staking module","text":"

responsible for the proof of stake (PoS) layer of the Stratos-chain. It contains create/edit validator as well as delegation operations.

  • Create new validator initialized with a self-delegation to it.

Example:

stchaind tx staking create-validator \\\n--amount=100stos \\\n--pubkey='{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"JwtmYzaX0b+zjuDypUI2+qy8wa/LFtUUUg0+vr11tpg=\"}' \\\n--moniker=\"myValidator\" \\\n--commission-rate=0.10 \\\n--commission-max-rate=0.20 \\\n--commission-max-change-rate=0.01 \\\n--min-self-delegation=1 \\\n--from=st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0 \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

  • Edit(modify) an existing validator Info(params). You can add more information to the validator, such as --website, or --memo.

Example:

stchaind tx staking edit-validator \\\n--from=user0 \\\n--keyring-backend=test \\\n--min-self-delegation=100  \\\n--memo=\"Change 'min-self-delegation' from 1 to 100\" \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

  • Delegate an amount of liquid coins to a validator from your wallet.

Example:

stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100stos \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei\n

  • Unbond an amount of bonded shares from a validator.

Example:

stchaind tx staking unbond stvaloper12adksjsd7gcsn23h5jmvdygzx2lfw5q4pyf57u 100stos \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

  • Query delegations for an individual delegator on all validators.

Example:

stchaind query staking delegations st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n

  • Query details about an individual validator.

Example:

stchaind query staking validator stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n

  • Query values for amounts stored in the staking pool.

Example:

stchaind query staking pool\n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#-distribution-module","title":"- distribution module","text":"

Responsible for distributing staking rewards between validators, delegators, and the Community Pool. It contains operations to claim rewards form a validator and specially, query all slashes of a validator. You cannot withdraw a part of reward. Every time you withdraw, all reward will be withdrawn.

  • Withdraw rewards from a given delegation address and optionally withdraw validator's commission if the delegation address given is a validator operator.

Example:

stchaind tx distribution withdraw-rewards stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

  • Withdraw all delegation rewards for a delegator.

Example:

stchaind tx distribution withdraw-all-rewards \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

  • Query all rewards earned by a delegator, optionally restrict to reward from a single validator.

Example:

stchaind query distribution rewards st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda --height=9765\n

  • Query distribution outstanding (un-withdrawn) rewards for a validator and all their delegations.

Example:

stchaind query distribution validator-outstanding-rewards stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k --height=9765\n

  • Query all coins in the community pool.

Example:

stchaind query distribution community-pool --height=9765\n

  • Query all slashes of a validator for a given block range.

Example:

stchaind query distribution slashes stvaloper1095s2f3m60qz48spy3wr52gw8xmy7xqywnxnrq 0 500\n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#-slashing-module","title":"- slashing module","text":"

Responsible for enabling Stratos Chain to penalize any validator for an attributable violation of protocol rules by slashing (i.e. partially destroying) the bonded tokens. We usually use unjail command to un-jail a validator and Information about validator's liveness activity is tracked through signing-info.

  • Unjail a jailed validator.

Example:

stchaind tx slashing unjail --from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei -y\n

  • Use a validators' consensus public key to find the signing-info for that validator.

Example:

stchaind query slashing signing-info '{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"gkpFejHRUaNjvaKpYXvsaUGJsIC5zrXu0ZlqOSF2Wms=\"}'\n

You can find all detailed explanations at

  • Stratos-chain 'stchaind' Commands(part1)
  • Stratos-chain 'stchaind' Commands(part2)
  • Stratos-chain REST APIs
  • Stratos-Chain gRPC Queries

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#slashing","title":"Slashing","text":"

slashing is a validator punishment mechanism. If a validator misbehaves, its bonded stake along with its delegators' stake will be slashed. As Cosmos states, there are 3 main faults that can result in slashing of funds for a validator and its delegators:

Faults:

  • Double-sign: occurs when a validating entity (private key) submits two signed messages for the same block. double-sign makes it more difficult for the network to reach consensus. The system will then permanently burn (\"slash\") that validator's total delegations (stake-backing) by the parameter SlashFractionDoubleSign(5% currently). All delegators to an offending validator will lose 5% of all STOSs delegated to this validator. At this point the validator will be tombstoned, which means the validator will be permanently removed from the active validator set, and can never unjail.

  • Unavailability(Downtime): It occurs when a validator is unavailable to sign transactions on a blockchain for a certain period of time. for example, if a validator in the active set is offline for too long(missing more than 95% of the last 10.000 blocks), the validator will be slashed by the parameter SlashFractionDowntime(0.01%) and temporarily removed from the active set(jailed) for at least the DowntimeJailDuration(10 minutes currently). If the jailing is due to being offline for too long, the validator can send an unjail transaction in order to re-join the validator set.

  • Non-voting: If a validator did not vote on a proposal and once the fault is reported, its stake will receive a minor slash.

We have to be aware that even if a validator does not intentionally misbehave, it can still be slashed if

  • its node crashes
  • loses connectivity
  • gets DDOSed
  • its private key is compromised

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#validators-faq","title":"Validators FAQ","text":""},{"location":"docs-stratos-chain/how-to-become-a-validator/#why-the-validator-status-is-0-and-cannot-find-it-in-active-list","title":"Why the validator status is 0 and cannot find it in active list?","text":"

Validator status is 0 means that the validator stake is unbonded. When using create-validator transaction, you have defined the flag min-self-delegation, the minimum amount of stake the validator needs to have bonded at all time. If the validator's self-delegated stake falls below this limit, their entire staking pool will unbond and the validator status is 0. Although this validator has been created, it will not show in the validator set.

You need to delegate more tokens to this validator until the amount of stake is more than min-self-delegation.

In addition, since we limited the number of active validators to the most staked 100 candidates, if your validator's total stake less than that of the 100th validator, your validator will lose its validator privileges and will not display in the active validator set. The minimum stake of an active validator(stake of the 100th validator) can can be found at Stratos Exporer.

To solve this problem, you can get more tokens delegated until the total stake of your validator is more than the minimum stake of an active validator using the following command

stchaind tx staking delegate <validator-addr> <amount> \\\n--from=<name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend'> \\\n--gas=auto \\\n--gas-adjustment=1.5 \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#why-my-validator-is-jailed-and-inactive","title":"Why my validator is jailed and inactive?","text":"

Sometimes, you may see your validator is jailed and the voting power become 0. The shares of the validator are unbonded in order to not affecting the running of the network. If this happens, check your validator information and see if your validator was jailed by sending the following command.

stchaind query staking validator <validator_operator_address>\n...\njailed: true\nstatus: 1\n...\n

This means the validator is jailed and the validator status is unbonding.

Tip

A lot of scenarios may lead to a validator jailing, like:

  • Double-sign. Validator cannot re-join to validator set.
  • Unbond too many stake, making the bonded stake is lower than the min-self-delegation
  • Downtime: unavailable to sign transactions on a blockchain for a certain period of time
  • Non-voting
  • Low on disk space
  • Node crashes(node does not start or does not catch up to the latest block)

Except for double-sign, you have to wait for your node finishes catch-up and wait at least 10 minutes(downtime jail duration).

Then, you can unjail your validator.

Finally, check your validator again to see if the validator's voting-power is back.

If the problem still persists, please make sure you have enough tokens delegated to your validator.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#how-can-i-check-my-validator-info-such-as-voting-power","title":"How can I check my validator info such as voting-power?","text":"

There are three ways to check it:

  • Stratos Explorer
  • status command:
stchaind status\n

Response:

    {\n    \"NodeInfo\": {\n        \"protocol_version\": {\n            \"p2p\": \"8\",\n            \"block\": \"11\",\n            \"app\": \"0\"\n        },\n        \"id\": \"16a0758d175cbf5c08d41dffa73eb5c0190869ed\",\n        \"listen_addr\": \"tcp://0.0.0.0:26656\",\n        \"network\": \"mesos-1\",\n        \"version\": \"0.37.4\",\n        \"channels\": \"40202122233038606100\",\n        \"moniker\": \"node\",\n        \"other\": {\n            \"tx_index\": \"on\",\n            \"rpc_address\": \"tcp://127.0.0.1:26657\"\n        }\n    },\n    \"SyncInfo\": {\n        \"latest_block_hash\": \"4A1AA4808B4199B2247B5DEA1B94B016FA60691EFF8B191AED556978C5981673\",\n        \"latest_app_hash\": \"DCD79CCD19F078615BD073D9420D3368D768674EEB80361FAB0AA143BBDCC65C\",\n        \"latest_block_height\": \"1026\",\n        \"latest_block_time\": \"2023-01-11T01:54:59.009329495Z\",\n        \"earliest_block_hash\": \"139676534FECFA507D56A06B03BD528E70ACA6D4DB6560219707011966613DE4\",\n        \"earliest_app_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n        \"earliest_block_height\": \"1\",\n        \"earliest_block_time\": \"2023-01-09T17:08:58.4890503Z\",\n        \"catching_up\": false\n    },\n    \"ValidatorInfo\": {\n        \"Address\": \"18A7169C1B427D994133F7B3D4504E92789DB37C\",\n        \"PubKey\": {\n            \"type\": \"tendermint/PubKeyEd25519\",\n            \"value\": \"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\"\n        },\n        \"VotingPower\": \"500000\"\n    }\n  }\n
  • API
curl localhost:26657/status\n

Response:

   {\n  \"jsonrpc\": \"2.0\",\n  \"id\": -1,\n  \"result\": {\n    \"node_info\": {\n      \"protocol_version\": {\n        \"p2p\": \"8\",\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"id\": \"16a0758d175cbf5c08d41dffa73eb5c0190869ed\",\n      \"listen_addr\": \"tcp://0.0.0.0:26656\",\n      \"network\": \"mesos-1\",\n      \"version\": \"0.37.4\",\n      \"channels\": \"40202122233038606100\",\n      \"moniker\": \"node\",\n      \"other\": {\n        \"tx_index\": \"on\",\n        \"rpc_address\": \"tcp://127.0.0.1:26657\"\n      }\n    },\n    \"sync_info\": {\n      \"latest_block_hash\": \"0B67BB5EF1CB8DB944E9A09D2E5E9A69CFCF3CF28510EC36775A6DE16087C4D7\",\n      \"latest_app_hash\": \"97C730F39277540A16363B9B25D0283FE139A1BB894F3BBD744CC6785733C204\",\n      \"latest_block_height\": \"1035\",\n      \"latest_block_time\": \"2023-01-11T01:55:44.25650962Z\",\n      \"earliest_block_hash\": \"139676534FECFA507D56A06B03BD528E70ACA6D4DB6560219707011966613DE4\",\n      \"earliest_app_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n      \"earliest_block_height\": \"1\",\n      \"earliest_block_time\": \"2023-01-09T17:08:58.4890503Z\",\n      \"catching_up\": false\n    },\n    \"validator_info\": {\n      \"address\": \"18A7169C1B427D994133F7B3D4504E92789DB37C\",\n      \"pub_key\": {\n        \"type\": \"tendermint/PubKeyEd25519\",\n        \"value\": \"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\"\n      },\n      \"voting_power\": \"500000\"\n    }\n   }\n  }\n

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#is-there-any-minimum-amount-of-stake-to-delegate-to-a-validator","title":"Is there any minimum amount of stake to delegate to a validator?","text":"

( and is there a minimum amount of STOS that must be delegated to be an active (bonded) validator?)

There's no limitation for delegating the validator, but a tiny amount of delegation may be ignored by the algorithm when distributing rewards.

When you use create-validator transaction to create a validator, the flag --min-self-delegation defines the minimum amount of stake. If a validator's bonded stake goes below the limit that it predefined, this validator and all of its delegators will unbond. In testing phase, the system takes only the top 100 validators with the highest weight(voting power) into the active list. The more bonded stake a validator has, the more possible to be an active one. We recommend 100stos when you create your validator.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#what-is-self-delegation-how-can-i-increase-my-self-delegation","title":"What is self-delegation? How can I increase my self-delegation?","text":"

Self-delegation is a delegation of stake from a validator to itself. The delegated amount can be increased by sending a delegate transaction from your validator's wallet address.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#what-are-the-responsibilities-of-a-validator","title":"What are the responsibilities of a validator?","text":"

Validators have two main responsibilities:

  • Be able to constantly run a correct version of the software: Validators need to make sure 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, they should always be up-to-date with the current state of the ecosystem so that they can easily adapt to any change.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#how-often-will-a-validator-be-chosen-to-propose-the-next-block","title":"How often will a validator be chosen to propose the next block?","text":"

The validator that is selected to propose the next block is called proposer. Each proposer is selected deterministically, and the frequency of being chosen is proportional to the voting power (i.e. amount of bonded tokens) of the validator.

"},{"location":"docs-stratos-chain/how-to-become-a-validator/#why-validator-keeps-getting-jailed-after-some-time","title":"Why validator keeps getting jailed after some time?","text":"

If you have tried to unjail, but your node is jailed again shortly after, it most probably means that your validator has been tombstoned.

A validator is in tombstone status only when it double-signs. Once your validator double-signs it will no longer be able to re-join the active set with the same validator key.

In order to avoid this, you need to always make sure that each of your nodes does not validate with the same private key.

Also, once your validator is tombstoned, all you can do is create a new one, and earn again all the delegations that you had before.

"},{"location":"docs-stratos-chain/how-to-setup-rest-grpc-full-chain/","title":"HowTo Setup Full-Chain as REST or gRPC","text":"

In order to work properly, a SDS node needs to generate, sign and broadcast transaction to the Stratos chain through a Full-Chain node.

Stratos provides a public endpoint at rest-mesos.thestratos.org for cases when there's only a SDS node running and a Full-Chain is not available.

However, this setup is particularly useful if you run both a Full-Chain and a SDS node because you can setup your own REST/gRPC endpoint in your Full-Chain node so it can be used for your SDS node. This means that you will have improved performance, faster responses and you won't be dependent on the public endpoint which may get overloaded at times.

This setup is also useful for server farms running multiple SDS nodes.

Tip

Currently, in mesos-1 testnet, SDS nodes are using REST API but this will be changed to gRPC API once mainnet is launched.

"},{"location":"docs-stratos-chain/how-to-setup-rest-grpc-full-chain/#rest-setup","title":"REST Setup","text":"

To enable REST API in your Full-Chain Node, edit the app.toml file:

nano ~/.stchaind/config/app.toml\n

And set enable to true and (optionally) edit the address variables. You can change the ip to listen only on local or lan requests and/or you can change the default port.

###############################################################################\n###                           API Configuration                             ###\n###############################################################################\n\n# Enable defines if the API server should be enabled.\nenable = true\n\n# Address defines the API server to listen on.\naddress = \"tcp://0.0.0.0:1317\"\n

Usage example:

curl http://localhost:1317/cosmos/bank/v1beta1/balances/st1pgzvq9p5gyxu7gpe8l33g8nzq0xsfyeaeww3ru\n\n\n{\"height\":\"46397\",\"result\":[\n  {\n    \"denom\": \"wei\",\n    \"amount\": \"499999996283820000000\"\n  }\n]}\n

You can see all the REST queries here.

To use your Full-Chain REST API for your SDS node, edit this file:

nano ~/rsnode/configs/config.toml\n

and edit this line with your REST url:

stratos_chain_url = 'http://127.0.0.1:1317'\n

"},{"location":"docs-stratos-chain/how-to-setup-rest-grpc-full-chain/#grpc-setup","title":"gRPC Setup","text":"

gRPC will be used by SDS nodes in mainnet. To enable or configure gRPC for your Full-Chain node, edit this file:

nano ~/.stchaind/config/app.toml\n

And search for this section:

###############################################################################\n###                           gRPC Configuration                            ###\n###############################################################################\n\n# Enable defines if the gRPC server should be enabled.\nenable = true\n\n# Address defines the gRPC server address to bind to.\naddress = \"0.0.0.0:9090\"\n

Usage example:

Tip

You can get the precompiled grpcurl binary here.

grpcurl -plaintext 127.0.0.1:9090 list stratos.register.v1.Query\n\nstratos.register.v1.Query.BondedMetaNodeCount\nstratos.register.v1.Query.BondedResourceNodeCount\nstratos.register.v1.Query.DepositByNode\nstratos.register.v1.Query.DepositByOwner\nstratos.register.v1.Query.DepositTotal\nstratos.register.v1.Query.MetaNode\nstratos.register.v1.Query.Params\nstratos.register.v1.Query.RemainingOzoneLimit\nstratos.register.v1.Query.ResourceNode\n

You can see all the gRPC queries here.

To use your Full-Chain gRPC API for your SDS node (only after mainnet launch), edit your SDS config file:

nano ~/rsnode/configs/config.toml\n

and edit this line:

stratos_chain_url = '127.0.0.1:9090'\n

"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/","title":"How to use state sync to start stratos-chain","text":""},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#introduction","title":"Introduction","text":"

State sync allows a new node to join a network by fetching a snapshot of the application state at a recent height instead of fetching and replaying all historical blocks.

Since the application state is generally much smaller than the blocks, and restoring it is much faster than replaying blocks, this can reduce the time to sync with the network from days to minutes.

Warning

State Sync feature only works with new node installations.

"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#start-a-node-using-statesync","title":"Start a node using stateSync:","text":"MAINNET StateSyncTESTNET StateSync"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#1-get-the-last-block-height","title":"1. Get the last block height","text":"
curl -s http://rpc.thestratos.org/block | jq -r '.result.block.header.height'\n
Example response:\n695987\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#2-get-the-hash-for-the-block","title":"2. Get the hash for the block","text":"

Since snapshots are generated every 1,000 blocks, you'll need to obtain the hash for the block number at 1,000-interval heights.

For example, in the above response we got 695987 so we will need to request the hash for height 695000.

If latest block would have been 741589, we will request the hash for 741000 and so on.

Always use the most recent block height, rounded down to the nearest lower multiple of 1,000.

curl -s http://rpc.thestratos.org/block?height=695000 | jq -r '.result.block_id.hash'\n
Example response:\n8C138E7FE1FF3B237EF3938D524BCA25AF3DE1E041F08FD9E4B37C6BD14CBB6C\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#3-setup-configtoml","title":"3. Setup config.toml","text":"

Edit the state sync section of .stchaind/config/config.toml as follows:

Remember to use the latest height rounded down to last 1,000 round number and its hash.

#######################################################\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 = \"35.203.182.250:26657,35.230.38.120:26657\"\ntrust_height = 1299000\ntrust_hash = \"C2B05D1974C9C68F69B3230208A65B2EBB042C8B8EBEC6471697A931A29519AE\"\ntrust_period = \"168h0m0s\"\n\n# Time to spend discovering snapshots before initiating a restore.\ndiscovery_time = \"15s\"\n\n# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp).\n# Will create a new, randomly named directory within, and remove it when done.\ntemp_dir = \"./tmp\"\n\n# The timeout duration before re-requesting a chunk, possibly from a different\n# peer (default: 1 minute).\nchunk_request_timeout = \"10s\"\n\n# The number of concurrent chunk fetchers to run (default: 1).\nchunk_fetchers = \"4\"\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#1-get-the-last-block-height_1","title":"1. Get the last block height","text":"
curl -s http://rpc-mesos.thestratos.org/block | jq -r '.result.block.header.height'\n
Example response:\n326121\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#2-get-the-hash-for-the-block_1","title":"2. Get the hash for the block","text":"

Since snapshots are generated every 1,000 blocks, you'll need to obtain the hash for the block number at 1,000-interval heights.

For example, in the above response we got 326121 so we will need to request the hash for height 326000.

If latest block would have been 374521, we will request the hash for 374000 and so on.

Always use the most recent block height, rounded down to the nearest lower multiple of 1,000.

curl -s http://rpc-mesos.thestratos.org/block?height=326000 | jq -r '.result.block_id.hash'\n
Example response:\nC524665A353CB6C5E03D4B73B3151FA00862704A0966E01C5E97F1DE1B08B1B4\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#3-setup-configtoml_1","title":"3. Setup config.toml","text":"

Edit the state sync section of .stchaind/config/config.toml as follows:

Remember to use the latest height rounded down to last 1,000 round number and its hash.

#######################################################\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 = \"35.233.191.198:26657,35.233.191.198:26657\"\ntrust_height = 326000\ntrust_hash = \"C524665A353CB6C5E03D4B73B3151FA00862704A0966E01C5E97F1DE1B08B1B4\"\ntrust_period = \"168h0m0s\"\n\n# Time to spend discovering snapshots before initiating a restore.\ndiscovery_time = \"15s\"\n\n# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp).\n# Will create a new, randomly named directory within, and remove it when done.\ntemp_dir = \"./tmp\"\n\n# The timeout duration before re-requesting a chunk, possibly from a different\n# peer (default: 1 minute).\nchunk_request_timeout = \"10s\"\n\n# The number of concurrent chunk fetchers to run (default: 1).\nchunk_fetchers = \"4\"\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#4-disable-json-rpc","title":"4. Disable JSON-RPC","text":"

The EVM RPC will prevent your node from starting using state sync, so you can temporarily disable it by editing .stchaind/config/app.toml:

You can re-enable it once node's sync is up to date (node restart required).

[json-rpc]\n# Enable defines if the gRPC server should be enabled.\nenable = false\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#5-start-the-node","title":"5. Start the node","text":"

Node can now be started with the usual command:

stchaind start\n
"},{"location":"docs-stratos-chain/how-to-start-with-state-sync/#become-snapshot-provider","title":"Become snapshot provider","text":"

To provide the StateSync snapshot, the operator must enable the snapshot-interval in the node configuration:

# 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 = 2\n

"},{"location":"docs-stratos-chain/mainnet-bridge/","title":"HowTo Bridge STOS From Ethereum to Stratos Mainnet","text":""},{"location":"docs-stratos-chain/mainnet-bridge/#introduction","title":"Introduction","text":"
  • IMPORTANT: Before proceding, make sure to download and install the latest version of Stratos Network Wallet [Download]
  • IMPORTANT: Never send STOS directly from Ethereum network to a Stratos wallet. Migration has to go through the bridge app or else the tokens will be lost.
  • The bridge web app is only available for Metamask.
  • STOS tokens have to be on ETH network and you need some ETH for gas fees.
  • If your tokens are on a CEX (other than Gate.io), you need to withdraw them to Metamask first. If your tokens are on Gate.io, you might be interested in withdrawing directly from Gate to Stratos Network (tutorial here).
  • If in doubt, please use telegram or discord to ask for assistance (links at the bottom of the page). Or, at least, send a small test transaction first, the fee will be worth the trouble if something is wrong.

WARNING

The ONLY URL for the bridge is:

app.exoswap.io

Always check the URL and beware of scammers!

"},{"location":"docs-stratos-chain/mainnet-bridge/#ethereum-to-stratos","title":"Ethereum to Stratos","text":"
  • Make sure your Metamask wallet has STOS tokens as ERC-20 and some ETH for gas fee. Next, open the bridge URL and connect the wallet.
  • Enter the amount of STOS you want to bridge and click Approve.
  • Approve a spending limit. Make sure you set the limit at least equal to the amount you want to bridge.
  • Once the spending limit is approved, initiate the transfer. This process could take aprox. 2-3 minutes.
  • Next, you need to add the Stratos Network details to Metamask. Click the upper left button and then click Add Network.
  • In the next screen, enter the following details:
Setting Name Value Network name Stratos New RPC URL https://web3-rpc.thestratos.org Chain ID 2048 Currency symbol STOS Block Explorer URL https://web3-explorer.thestratos.org
  • Your STOS tokens should now be visible on the Stratos network.
"},{"location":"docs-stratos-chain/mainnet-bridge/#stratos-to-ethereum","title":"Stratos to Ethereum","text":"

Migrating back to Ethereum network is basically the same process, but backwards.

  1. Open Metamask and make sure it's connected to Stratos Network.

  2. Once you see your STOS tokens in Metamask (connected to Stratos), open ExoSwap.

  3. Change the order of the operation using the switch button in the middle and make sure the first chain is set to Stratos:

  4. Start the transfer process.

Warning

Fees for bridging from Stratos to Ethereum are quite high (out of our control, it's what Ethereum network is charging) so alternatively, you could use the migration option through Gate.io.

"},{"location":"docs-stratos-chain/mainnet-staking/","title":"HowTo Stake STOS on Stratos Mainnet","text":""},{"location":"docs-stratos-chain/mainnet-staking/#introduction","title":"Introduction","text":"
  • IMPORTANT: Before proceding, make sure to download and install the latest version of Stratos Network Wallet [Download].
  • If your tokens are on the ETH network or on a CEX, you need to bridge them to Stratos Network tutorial here.
  • If in doubt, please use telegram or discord to ask for assistance.
  • Please choose carefully your staking metwork (Stratos Wallet OR MetaMask) as you won't be able to import one wallet into another (they are using different type of seed phrase). The only way to switch from a wallet type to another is by unstaking and then sending the tokens to the other wallet type, but that will take 21 days.

WARNING

The ONLY URL for the bridge and staking is:

app.exoswap.io

Always check the URL and beware of scammers!

"},{"location":"docs-stratos-chain/mainnet-staking/#using-stratos-wallet","title":"Using Stratos Wallet","text":"
  • Go to thestratos.org/stratos-network-wallet and download the Stratos Wallet.

  • Import an existing wallet address or generate a new one. To generate a new one, click Create or Import Wallet and the click Generate new Mnemonic button to generate a new seed phrase.

Please keep your seed phrase in a safe location. You won't be able to retrieve it again from the wallet application!

  • Copy the wallet address in the st1ABC format by clicking the copy button.

  • Open the Address Convertor Page and Paste the st1xxx format address in the stos based address field.

Next, copy the translated address in the 0xABC form.

  • Go to Metamask and transfer STOS tokens to the 0xABC address.

  • Go back to your Stratos Wallet and click the refresh balance button. You should see your tokens there.

  • Next, go to the Reward tab and choose a validator. Click Delegate next to it and stake your coins.

  • Your tokens are now staked.

You can check back from time to time and withdraw your rewards by clicking on the Get all rewards button.

"},{"location":"docs-stratos-chain/mainnet-staking/#unstake-with-stratos-wallet","title":"Unstake with Stratos Wallet","text":"
  • To unstake your tokens, open the Stratos Wallet, go to Send Transaction, choose transaction type Undelegate, select the validator you want to unstake from, enter amount and generate the transaction.

Warning

There is a 21 days cool-down period so you will receive your unstaked coins back into your wallet after 21 days.

"},{"location":"docs-stratos-chain/mainnet-staking/#using-metamask","title":"Using MetaMask","text":"
  • To stake your STOS tokens to a validator on Stratos Chain using MetaMask, your STOS tokens must be on the Stratos Network and your MetaMask must be connected to Stratos Chain.

  • Once you completed the Ethereum to Stratos bridge, you should find your STOS tokens in your MetaMask account connected to Stratos Network.

  • Open app.exoswap.io. Navigate to Staking and connect your MetaMask wallet.

  • Choose any validator in the list and enter the desired amount of tokens you would want to stake, then press Delegate.

Do not use MAX, leave at least 0.01 STOS in balance to cover the transaction fees.

  • Confirm the transaction.

  • Your STOS is now delegated and earning staking rewards.

  • You can claim the rewards anytime and re-stake them but always remember to leave a small amount to cover for the transaction fees.

"},{"location":"docs-stratos-chain/mainnet-staking/#unstake-with-metamask","title":"Unstake with MetaMask","text":"
  • Open app.exoswap.io. Navigate to Staking and connect your MetaMask wallet.

  • Open the validator you staked to and click on the drop down menu under amount details and select Undelegate.

  • Select the amount of tokens you want to undelegate and press the Undelegate button to process the transaction.

  • MetaMask will ask you to confirm the transaction.

  • After 21 days, you will receive your rewards back in your balance.

Please keep in mind

  • A validator's voting power will NOT affect your earning potential. Your earning will be the same, regardless of the validator you chose.

  • The only thing influencing your rewards if the commission amount each validator is charging.

  • For the sake of decentralization, we should all make sure we keep our validators` Voting Power as equal as possible.

  • Your staking rewards can be withdrawn at any time but your staking DEPOSIT has a 21 days lock-down period.

"},{"location":"docs-stratos-chain/network/","title":"Network","text":""},{"location":"docs-stratos-chain/network/#network-details","title":"Network details","text":"MainnetMesos Testnet

The documentation corresponding contains details for the RPC - HTTP, WS endpoints. There is also a full node setup if you wish to setup your own full node.

Service Details RPC https://rpc.thestratos.org/ REST https://rest.thestratos.org/ gRPC https://grpc.thestratos.org/ Block Explorer https://explorer.thestratos.org/

Mesos Testnet replicates the Stratos Mainnet, which is to be used for testing. Testnet coins are separate and distinct from actual tokens/assets, and are never supposed to have any value. This allows application developers or validators/testers to experiment, without having to use real assets or worrying about breaking the main Stratos chain.

The documentation corresponding contains details for the RPC - HTTP, WS endpoints. There is also a full node setup if you wish to setup your own full node.

Service Details RPC https://rpc-mesos.thestratos.org/ REST https://rest-mesos.thestratos.org/ Faucet https://faucet-mesos.thestratos.org/ Block Explorer https://explorer-mesos.thestratos.org/

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/","title":"Full-Chain Node","text":""},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#introduction","title":"Introduction","text":"

Stratos blockchain facilitates all decentralized ledger transactions and functionalities, providing settlement services and related financial payment services for network providers and network users in an efficient, fair and transparent manner.

The Stratos-chain full-nodes are dedicated servers with sufficient computing power that participate in block generation cycle. It is necessary in order to be a validator.

In practice, running a full-node only implies running a non-compromised and up-to-date version of the software with low network latency and without downtime. It is encouraged to run a full-node even if you do not plan to be a validator.

The Stratos-chain validator is a full-node that participates in the Stratos Chain block generation cycle and also voting for the validity of a block proposed.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#requirements","title":"Requirements","text":"

Here are the required hardware/software to run a Stratos-chain full-node:

Minimum Hardware Requirements

CPU RAM Storage Stake 8 Cores\u00b9, 2.5GHz\u00b2 32 GB 2 TB 1 STOS\u00b3

\u00b9 \u00a0\u00a0 Can be achieved using dual CPU server configurations (eg. 2cpu x 8cores, as long as the frequency per core is respected). \u00b2 \u00a0\u00a0 2.5GHz refers to Base Frequency, not Turbo/Boost Frequency. \u00b3 \u00a0\u00a0 Minimum stake is 1 stos until all 100 validator spots are filled. After that, is marked decided.

Software (tested version)

  • Ubuntu 18.04+
  • Go 1.20+ linux/amd64

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#setup-environment","title":"Setup Environment","text":"

In order to run a Stratos-chain full-node, you may need to build stratos-chain source code yourself which requires Go 1.19+, git, curl and make installed.

This process depends on your operating system.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#linux-users","title":"Linux Users","text":"

The following example is based on Ubuntu 18.04+ 64-bit(Debian) and assumes you are using a terminal environment by default.

Please run the equivalent commands if you are running other Linux distributions.

# Update the system\nsudo apt update\nsudo apt upgrade\n\n# Install git, snap and make(you can also install them separately as your needs)\nsudo apt install git build-essential curl tmux libgmp3-dev flex bison --yes\n\n# Install PBC library\nwget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz\ntar xfz pbc-0.5.14.tar.gz && cd pbc-0.5.14\n./configure\nmake\nsudo make install\nsudo ldconfig\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#windows-users","title":"Windows Users","text":"

It is possible to build and run the software on Windows. However, we did not test it on Windows completely.

It may give you unexpected results, or it may require additional setup.

An alternative option is to install a separate virtual Linux system using VirtualBox or VMware Workstation.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#setup-a-stratos-chain-full-node","title":"Setup a Stratos-chain full-node","text":""},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#create-a-user-account","title":"Create a user account","text":"

To create a separated and more secure environment, it is recommended to create a separated user account stratos to run your node.

sudo adduser stratos --home /home/stratos\n

Once the user account stratos is created, switch and login the system using stratos. You will proceed with the following steps in context of that user.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#get-release-files","title":"Get release files","text":"

Tip

There are two ways to get the these binary executables:

  • Download pre-compiled executabled (for Ubuntu 18.04+ x86_64).
  • Download source code and compile it yourself.

Please choose only one of them based on your operating system.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#pre-compiled-executables","title":"Pre-compiled executables","text":"

The following binary stchaind has been built and ready to be downloaded directly.

# Make sure we are inside the $HOME folder\ncd $HOME\nwget https://github.com/stratosnet/stratos-chain/releases/download/v0.12.0/stchaind\n

  • Check the granularity
# Make sure we are inside the $HOME folder and check these two binary executables\ncd $HOME\n\n# Check granularity\nmd5sum stchaind\n\n## Expected output\n## 0d4a0fd5173fa273f6150b28e48086a3  stchaind\n

  • Add execute permission to this binary
# Make sure the file can be executed\nchmod +x stchaind\n

  • Add the binary to the search path
mkdir ~/bin \necho 'export PATH=\"$HOME/bin:$PATH\"' >> ~/.profile \nsource ~/.profile\nmv stchaind ~/bin \n
  • Verify installation
stchaind version\n\n# Should return v0.12.0\n

Tip

\ud83d\udca1 This binary is built for Ubuntu 18.04+ amd64. if you have other Linux kernels or you have any issues with the pre-compiled binary please, follow the next step to build your own binary from source code.

Otherwise, continue with Networks.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#compile-the-source-code","title":"Compile the source code","text":"

Before the following steps, please make sure you have Go 1.19+ installed .

# Check if go is already installed:\ngo version\n\n# If it's not, you can install it with snapd:\nsudo apt install snapd\nsudo snap install go --classic\n

Alternatively, you can follow the official instructions: link

  • Build the extracted source code
git clone https://github.com/stratosnet/stratos-chain.git\ncd stratos-chain\ngit checkout tags/v0.12.0\nmake build\n

  • Installing the binary executable
mkdir ~/bin \necho 'export PATH=\"$HOME/bin:$PATH\"' >> ~/.profile \nsource ~/.profile\ncp build/stchaind ~/bin \n
  • Verify installation
stchaind version\n\n# Should return v0.12.0\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#networks","title":"Networks","text":"

Currently, there are two live blockchains you can join:

  • Mainnet (Stratos) which is using real tokens and it's a production environment.

  • Testnet (Mesos) which is using test tokens. You can setup a validator here at first if you want to test your system, see how things work, etc, without the risk of losing real tokens if something goes wrong.

  • This guide applies to both, with a few small differences:

Variable\u2935 Mainnet Testnet chain-id stratos-1 mesos-1 keyring-backend file / os / pass test"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#keyring-backend","title":"keyring-backend","text":"

On Testnet, the keyring's backend is test, i.e., --keyring-backend=test

  • The test backend is a password-less variation of the file backend. Keys are stored unencrypted on disk.

On Mainnet, the keyring's backend can be file, os or pass e.g., --keyring-backend=file

  • The file backend stores the keyring encrypted within the app's configuration directory. This keyring will request a password each time it is accessed. (Recommended)
  • The os backend relies on operating system-specific defaults to handle key storage securely since operating system's default credentials managers are designed to meet users' most common needs and provide them with a comfortable experience without compromising on security.
  • The pass backend uses the pass utility to manage on-disk encryption of keys' sensitive data and metadata. Keys are stored inside gpg encrypted files within app-specific directories. More info at passwordstore.org
"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#initialize-the-node","title":"Initialize the node","text":"
# Make sure we are inside the home directory\ncd $HOME\n\n# Create folders and initialize the node\nstchaind init \"<your_node_moniker>\" --chain-id <network_chain_id>\n\n# ignore the output since you need to download the genesis file \n

\ud83d\udca1 You can choose any your_node_moniker. This will be your node name.

\ud83d\udca1 network_chain_id is stratos-1 for Mainnet or mesos-1 for Testnet. See Networks.

  • Download the genesis.json and config.toml files
MainnetTestnet
wget https://raw.githubusercontent.com/stratosnet/mainnet/main/genesis/genesis.json\nwget https://raw.githubusercontent.com/stratosnet/mainnet/main/config.toml\n
wget https://raw.githubusercontent.com/stratosnet/stratos-chain-testnet/main/genesis.json\nwget https://raw.githubusercontent.com/stratosnet/stratos-chain-testnet/main/config.toml\n

\ud83d\udca1 We strongly recommend using this downloaded config.toml for v0.12.0, instead of the ones for previous versions to avoid any mismatching.

  • Change moniker in the downloaded config.toml file

Please change your node moniker by modifying the config.toml file. Open this file with an editor, search moniker (usually at Line #18) in the file to find the \u201cmoniker\u201d field.

Change it to any value you like. It\u2019s your node name that will show on the network.

# A custom human readable name for this node\nmoniker = \"<your_node_moniker>\"\n

  • Move the downloaded config.toml and genesis.json files to stchaind folder (default in $HOME/.stchaind/config/). Replace if you already have these files.
mv config.toml $HOME/.stchaind/config/\nmv genesis.json $HOME/.stchaind/config/\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#directory-structure","title":"Directory structure","text":"

After you finished the above steps, your $HOME folder should include the following directories and files.

.\n\u251c\u2500\u2500 ...\n\u251c\u2500\u2500 .stchaind\n\u2502   \u251c\u2500\u2500 config\n\u2502   \u2502   \u251c\u2500\u2500 app.toml\n\u2502   \u2502   \u251c\u2500\u2500 config.toml\n\u2502   \u2502   \u251c\u2500\u2500 genesis.json\n\u2502   \u2502   \u251c\u2500\u2500 node_key.json\n\u2502   \u2502   \u2514\u2500\u2500 priv_validator_key.json\n\u2502   \u251c\u2500\u2500 data\n\u2502   \u2502    \u2514\u2500\u2500 priv_validator_state.json \n\u2502   \u2514\u2500\u2500 keyring-test\n\u251c\u2500\u2500 ...\n

Tip

\ud83d\udca1 By default, directory .stchaind will be created in the $HOME folder. The .stchaind folder contains the nodes` configurations and data.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#start-the-full-chain-node","title":"Start the full-chain node","text":"

Tip

Joining the network at a later time will require your node to download all the past blocks which, depending on how far ahead the network is, could take hours or even days.

Stratos Chain now supports StateSync which enables your node to use a snapshot of the current chain and start the sync from there, which will only take a couple of minutes.

You can find the StateSync Doc here.

There are three ways to run your Stratos-chain full-node.

Please choose ONE of them to start the node.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#in-foreground","title":"In foreground","text":"
# Make sure we are inside the home directory\ncd $HOME\n\n# run your node\nstchaind start\n\n# Use `Ctrl+c` to stop the node.\n
"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#in-background","title":"In background","text":"
# Make sure we are inside the home directory\ncd $HOME\n\n# run your node in backend\ntmux new -s stchaind\nstchaind start \n

Use the following Linux Command to stop your node.

pkill stchaind\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#as-service","title":"As service","text":"

All below steps require root privileges

  • Create the service file

Create the /lib/systemd/system/stratos.service file with the following content

[Unit]\nDescription=Stratos Chain Node\nAfter=network-online.target\n\n[Service]\nUser=stratos\nExecStart=/home/stratos/stchaind start --home=/home/stratos/.stchaind\nRestart=on-failure\nRestartSec=3\nLimitNOFILE=8192\n\n[Install]\nWantedBy=multi-user.target\n

Tip

\ud83d\udca1 In the [service] section:

  • User is your system login username
  • ExecStart designates the absolute path to the binary stchaind
  • --home is the absolute path to your node folder.
  • We used the default values for these variables. If you use a different username, group or folder to hold your node data instead of the default values, please modify these values according to your situations. Make sure the above values are correct.

  • Start your service

Once you have successfully created the service, you need to enable and start it by running

systemctl daemon-reload\nsystemctl enable stratos.service\nsystemctl start stratos.service\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#service-operations","title":"Service operations","text":"
  • Check the service status
systemctl status stratos.service\n
  • Check service log
journalctl -u stratos.service -f \n\n# exit with ctrl+c\n
  • Stop the service
systemctl stop stratos.service\n
"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#check-node-status","title":"Check node status","text":"

Once you start your full-node, it will connect to the peers and start syncing. You can check the status of the node by running the following command

# Check the status of the node\nstchaind status\n

The output will be similar to

stchaind status\n{\n    \"NodeInfo\": {\n        \"protocol_version\": {\n            \"p2p\": \"8\",\n            \"block\": \"11\",\n            \"app\": \"0\"\n        },\n        \"id\": \"16a0758d175cbf5c08d41dffa73eb5c0190869ed\",\n        \"listen_addr\": \"tcp://0.0.0.0:26656\",\n        \"network\": \"test-chain\",\n        \"version\": \"0.37.4\",\n        \"channels\": \"40202122233038606100\",\n        \"moniker\": \"node\",\n        \"other\": {\n            \"tx_index\": \"on\",\n            \"rpc_address\": \"tcp://127.0.0.1:26657\"\n        }\n    },\n    \"SyncInfo\": {\n        \"latest_block_hash\": \"697A2DB243E5191C6D85285A2ADD4924526924969C6C70FE71827C9FE41D4373\",\n        \"latest_app_hash\": \"E978F87BB23D351B853F5F0CF9FBBBA4464FF5D7CE3746BF3E2357F28CBCE041\",\n        \"latest_block_height\": \"497\",\n        \"latest_block_time\": \"2023-01-11T01:10:37.562405326Z\",\n        \"earliest_block_hash\": \"139676534FECFA507D56A06B03BD528E70ACA6D4DB6560219707011966613DE4\",\n        \"earliest_app_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n        \"earliest_block_height\": \"1\",\n        \"earliest_block_time\": \"2023-01-09T17:08:58.4890503Z\",\n        \"catching_up\": false\n    },\n    \"ValidatorInfo\": {\n        \"Address\": \"18A7169C1B427D994133F7B3D4504E92789DB37C\",\n        \"PubKey\": {\n            \"type\": \"tendermint/PubKeyEd25519\",\n            \"value\": \"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\"\n        },\n        \"VotingPower\": \"500000\"\n    }\n}\n

If the catching_up value is false in the sync_info section, it means that you are fully synced.

If it is true, it means your node is still syncing.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#setup-a-wallet","title":"Setup a wallet","text":"

Once the node finishes catch-up, you are ready to operate your node for various transactions(tx) and queries.

In order to hold the tokens that you will later delegate to your validator node, or pay staking for your SDS resource node, first, you need to create a local wallet account.

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#create-a-new-wallet","title":"Create a new wallet","text":"

To create a new wallet account, type the following command

stchaind keys add <your wallet name> --hd-path=\"m/44'/606'/0'/0/0\" --keyring-backend=<your chosen keyring backend>\n

Tip

\ud83d\udca1 Choose a keyring-backend suited for the network you are running this chain installation on. See keyring-backend.

\ud83d\udca1 Enter a wallet name that you will easily remember. This name will be used inside other commands later.

After creating a new local wallet account, you will get its address and pubkey.

In addition, you will have a secret recovery phrase(mnemonic phrase) which can be used to recover an existing wallet account and should be kept secret.

Example:

stchaind keys add myWallet --hd-path=\"m/44'/606'/0'/0/0\" --keyring-backend=test\n\n- name: myWallet\ntype: local\naddress: st1x2c6gy4vr8alsyzuqr2x8x8xxtvs97sk3jt6dp\npubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A7HCZTlHEarBPabkOgId5SlyQKdqEsbXJHit7y9LXRy+\"}'\nmnemonic: \"\"\n\n\n**Important** write this mnemonic phrase in a safe place.\nIt is the only way to recover your account if you ever forget your password.\n\nvenue chest pattern tool certain identify adult theme thing public foster promote pave topple thing uncle brisk suffer present popular envelope wrap holiday goddess\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#recover-an-existing-wallet","title":"Recover an existing wallet","text":"

If you already have a Stratos wallet account, you can recover it by typing the following command

stchaind keys add <your wallet name> --recover --hd-path=\"m/44'/606'/0'/0/0\" --keyring-backend=<your chosen keyring backend>\n

Tip

\ud83d\udca1 Choose a keyring-backend suited for the network you are running this chain installation on. See keyring-backend.

\ud83d\udca1 Enter a wallet name that you will easily remember. This name will be used inside other commands later.

Example:

stchaind keys add myWallet1 --recover --hd-path=\"m/44'/606'/0'/0/0\" --keyring-backend=test  \n

After the above keys add command executed, a keyring-* folder will be created which contains your wallets' information with their addresses.

The keyring-* folder looks like

.\n\u251c\u2500\u2500 32b1a412ac19fbf8105c00d46398e632d902fa16.address\n\u251c\u2500\u2500 d0c57269c450f81234307a33bd148ac4f90549e5.address\n\u251c\u2500\u2500 myWallet1.info\n\u2514\u2500\u2500 myWallet.info\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#check-your-wallet","title":"Check your wallet","text":"

There are two ways to check your local wallets

  • Check all local wallet accounts
stchaind keys list --keyring-backend=<keyring's backend> \n

Example:

stchaind keys list --keyring-backend=test\n   - address: st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw\n     name: user0\n     pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A/wF15Wd3ogCXstE7S4Zf3DA4KXb0W7exQhP004PLTi3\"}'\n     type: local\n   - address: st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0\n     name: user1\n     pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"AgnhB5EkHL8+jD0/zRDR11nIpfOirTRrjgCX6uibhmDW\"}'\n     type: local\n   - address: st1lkcrz3ktt2p7ppu9arglpqcn94pcdd9a9pmatf\n     name: user10\n     pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A2sZ2Z9BU9oDELC06Gj8Lfc5UycxTaPux3sEIq8sIzSW\"}'\n     type: local\n   - address: st16czjk2ym0prgvy4gl970t84vrp96s5kayfqmf2\n     name: user2\n     pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"AwfcJTOVWdx6ai61cy8VGJ1SdWHzwm2CCmr/+PwSpFeR\"}'\n     type: local\n   - address: st17patveqxcq42rguc7nayr2g3jtawpzvhfmmumt\n     name: user3\n     pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"AtFxbuB4s+2SYzImGPIBwe0H0mKCXbIPu1T63OvbgE/3\"}'\n     type: local\n

  • Check a specific local wallet account
stchaind keys show <your wallet name> --keyring-backend=<keyring's backend> \n

Example:

stchaind keys show myWallet1 --keyring-backend=test\n   - address: st16rzhy6wy2rupydps0gem69y2cnus2j09n42ksx\n     name: myWallet1\n     pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A13YKi3/7p9FsFPTfVgxEO0YK8bnDHmBPfA3ID+k37ET\"}'\n     type: local\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#faucet","title":"Faucet","text":"

Faucet will only be available on Testnet to get test tokens into your wallet.

curl --header \"Content-Type: application/json\" --request POST --data '{\"denom\":\"stos\",\"address\":\"your wallet address\"} ' https://faucet-mesos.thestratos.org/credit\n

Tip

Replace \"your wallet address\" with your st1xx wallet address

\ud83d\udca11stos = 1,000,000,000gwei = 1,000,000,000,000,000,000wei

  • Check wallet account balance

You can query your account info using this command:

stchaind query account <your wallet address>\n

Example:

stchaind query account st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\n|\n'@type': /cosmos.auth.v1beta1.BaseAccount\naccount_number: \"1\"\naddress: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\npub_key: null\nsequence: \"0\"\n

You can query your wallet balances using this command:

stchaind query bank balances <your wallet address>\n

Example:

stchaind query bank balances st1d3qtsjyypa639q9kf0wmuf2dn4a7zrnujw84q4\n|\nbalances:\n- amount: \"9998000000000000000\"\n  denom: wei\npagination:\nnext_key: null\ntotal: \"0\n

  • Try your first tx - send

This tx command will send an amount of tokens from one wallet address to another:

stchaind tx bank send <from address> <to address> <amount> --keyring-backend=<keyring's backend> --chain-id=<current chain-id> --gas=auto --gas-prices=1000000000wei\n
  • For chain-id and keyring-backend, see Networks.
  • Make sure your <from address> has enough tokens
  • Please wait for around 7 seconds for block generation after a transaction.

Example:

Let us assume:

  • from address: st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0
  • to address: st123wun5lnwerdrt0mk2uxtusgawpfr228a0sseg
  • amount: 10stos
stchaind tx bank send st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0 st123wun5lnwerdrt0mk2uxtusgawpfr228a0sseg 10stos \\\n--chain-id=mesos-1  --keyring-backend=test --gas=100000 --gas-prices=1000000000wei -y\n\ncode: 0\ncodespace: \"\"\ndata: \"\"\nevents: []\ngas_used: \"0\"\ngas_wanted: \"0\"\nheight: \"0\"\ninfo: \"\"\nlogs: []\nraw_log: '[]'\ntimestamp: \"\"\ntx: null\ntxhash: BA96CF87646592487ABB9DDDE8FA86FE71441226281B04E15C5C66EDE415FBC6\n

"},{"location":"docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/#validator","title":"Validator","text":"

At this point, you have a Full-Chain Node.

Full-Chain nodes are also important to the network as they are able to handle queries from a client and provide scale for the validator. They are also able to mantain historical information about the state of the chain.

But they are not able to accept transactions from clients, validate them and insert them into the blockchain, like Validators do. So they won't be earning any rewards.

To convert your Full-Node to a Validator, please follow the next guide.

How To Become a Validator

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/","title":"Stratos Chain stchaind commands part 1","text":"

This document is the first part that describes a summarized list of stchaind commands for Stratos Chain.

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#requirements","title":"Requirements","text":"

Unlike other projects, Stratos does not require expensive GPUs and high wattage power supplies, but if the node wants to obtain revenue, it needs to provide enough bandwidth and storage capacity to ensure the traffic on the node can reach the reward requirements.

We recommend the following to run your node:

Minimum Hardware Requirements

CPU RAM Storage Stake 8 Cores\u00b9, 2.5GHz\u00b2 32 GB 2 TB 1 STOS\u00b3

\u00b9 \u00a0\u00a0 Can be achieved using dual CPU server configurations (eg. 2cpu x 8cores, as long as the frequency per core is respected). \u00b2 \u00a0\u00a0 2.5GHz refers to Base Frequency, not Turbo/Boost Frequency. \u00b3 \u00a0\u00a0 Minimum stake is 1 stos until all 100 validator spots are filled. After that, is marked decided.

Software (tested version)

  • Ubuntu 18.04+
  • Go 1.19+ linux/amd64

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#connect-to-stratos-chain-testnet","title":"Connect to Stratos Chain Testnet","text":"

Please refer to full-node setup guide to:

download related files

start your node to catch up to the latest block height(synchronization)

create your Stratos Chain Wallet

Faucet or send an amount of tokens to this wallet

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#directory-structure","title":"Directory Structure","text":"

After the node has caught up to the latest block, your Stratos-chain Wallet has been created and fed with an amount of tokens, $HOME/.stchaind directory will include the following directories and files.

.\n\u251c\u2500\u2500 config\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 addrbook.json\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 app.toml\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.toml\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.toml\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 genesis.json\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 node_key.json\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 priv_validator_key.json\n\u251c\u2500\u2500 data\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 application.db\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 blockstore.db\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cs.wal\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 evidence.db\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 priv_validator_state.json\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 snapshots\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 state.db\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 tx_index.db\n\u2514\u2500\u2500 keyring-test\n    \u251c\u2500\u2500 6894f6eef2b730a5f071eed1f3aeb471dfeeeaaf.address\n    \u251c\u2500\u2500 d6052b289b78468612a8f97cf59eac184ba852dd.address\n    \u251c\u2500\u2500 d704353fe67f948c99d2e3105adc5159c9e8f2af.address\n    \u251c\u2500\u2500 f07ab66406c02aa1a398f4fa41a91192fae08997.address\n    \u251c\u2500\u2500 fdb03146cb5a83e08785e8d1f083132d4386b4bd.address\n    \u251c\u2500\u2500 user0.info\n    \u251c\u2500\u2500 user10.info\n    \u251c\u2500\u2500 user1.info\n    \u251c\u2500\u2500 user2.info\n    \u2514\u2500\u2500 user3.info\n

In stchaind/config folder:

  • addrbook.json stores peer addresses.
  • app.toml contains the default settings required for app.
  • config.toml contains various options pertaining to the stratos-chain configurations.
  • genesis.json defines the initial state upon genesis of stratos-chain.
  • node_key.json contains the node private key and should thus be kept secret.
  • priv_validator_key.json contains the validator address, public key and private key, and should thus be kept secret.

In stchaind/data folder:

  • All *.db folders are Tendermint databases
  • Tendermint uses a write ahead log (WAL) for consensus
  • priv_validator_state.jsonholds the validator's state

In stchaind/keyring-test folder:

  • holds the user's information and address in the keyring-backend

Tip

By default, the binary executable stchaind has been saved or created in the $HOME folder. If you are not sure what is your $HOME folder, in terminal, use echo $HOME to check. In the following instruction, we suppose you have entered the $HOME folder(use cd $HOME)

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#stchaind-commands","title":"'stchaind' Commands","text":"

For ease of use, these commands have been classified by the following modules:

  • Bank
  • Distribution
  • Gov
  • Slashing
  • Staking
  • Register
  • Sds
  • Pot
  • Tendermint
  • Others

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#global-flags","title":"Global Flags","text":"

Each command has its specific flags as well as several global flags. The specific flags will be explained along with each command, while the global flags are summarized as the following that can be used for all stchaind commands.

Global Flags(can be used for all stchaind commands):\n  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default \"sync\")\n      --chain-id string          Specify Chain ID for sending Tx (default \"testnet\")\n      --fees string              Fees to pay along with transaction; eg: 10wei\n      --from string              Name or address of private key with which to sign\n      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)\n      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10wei)\n  -h, --help                     help for stchaind\n      --home string              directory for config and data (default \"/home/hong/.stchaind\")\n      --keyring-backend string   Select keyring's backend (default \"os\")\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      --node string              <host>:<port> to tendermint rpc interface for this chain (default \"tcp://localhost:26657\")\n      --trace                    print out full stack trace on errors\n

Tip

  • --chain-id: the current chain-id may change when updating in testing phase . When it is applied, user needs to point out current chain-id which is mesos-1 for Testnet and stratos-1 for Mainnet.

  • on Testnet, --keyring-backend=test

  • on Mainnet, --keyring-backend=os|file|pass. You must use the same one you used when creating the wallet in previous guide (Setup Full-Chain Node).

  • --home: this directory contains node's account information. By default, node's account info is saved or created under $HOME/.stchaind. In this case, user does not need to add --home flag in the commands. Otherwise, user has to use this flag to specify the path to the node's root directory(default '$HOME') explicitly if not using the default directory. In the following instruction, we suppose the node info has been installed or created under $HOME/.stchaind and skip the --home flag. User can add it where applicable.

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#denomination","title":"Denomination","text":"

When executing commands that require a certain amount of tokens, you can use either denomination:

  • 1 stos =
  • 1,000,000,000 gwei =
  • 1,000,000,000,000,000,000 wei

For example, the following commands will result in transfering the same value (100 stos):

stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100stos \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n\nstchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100000000000gwei \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n\nstchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 100000000000000000000wei \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n
"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#bank-module","title":"Bank Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-send","title":"-send","text":"

Create and sign a send transaction.

Usage:\n  stchaind tx bank send [from_key_or_address] [to_address] [amount] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for send\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes \n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx bank send st1sqzsk8mplxx22fdgg878ccc3329gfd9g7d9g9d st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx 1stos \\\n--chain-id=mesos-1  \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-balances","title":"-balances","text":"

query account bank balances.

Usage:\n  stchaind query bank balances [account address] [flags]\n\nFlags:\n      --count-total       count total number of records in all balances to query for\n      --denom string      The specific balance denomination to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for balances\n      --limit uint        pagination limit of all balances to query for (default 100)\n      --offset uint       pagination offset of all balances to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of all balances to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of all balances to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query bank balances st16czjk2ym0prgvy4gl970t84vrp96s5kayfqmf2\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#distribution-module","title":"Distribution Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-withdraw-rewards","title":"-withdraw-rewards","text":"

Withdraw rewards from a given delegation address and optionally withdraw validator's commission if the delegation address given is a validator operator.

Usage:\n  stchaind tx distribution withdraw-rewards [validator-addr] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --commission            Withdraw the validator's commission in addition to the rewards\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for withdraw-rewards\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx distribution withdraw-rewards stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1  \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-withdraw-all-rewards","title":"-withdraw-all-rewards","text":"

Withdraw all delegation rewards for a delegator.

Usage:\n  stchaind tx distribution withdraw-all-rewards [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for withdraw-all-rewards\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --max-msgs int          Limit the number of messages per tx (0 for unlimited)\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx distribution withdraw-all-rewards \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1  \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-commission","title":"-commission","text":"

Query validator commission rewards from delegators to that validator.

Usage:\n  stchaind query distribution commission [validator] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for commission\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query distribution commission stvaloper1gtw399h9vfnekqsz3dg4n6mj0qgdpnh30x66xa\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-rewards","title":"-rewards","text":"

Query all rewards earned by a delegator, optionally restrict to reward from a single validator.

Usage:\n  stchaind query distribution rewards [delegator-addr] [validator-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for rewards\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query distribution rewards st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda --height=9765\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-outstanding-rewards","title":"-outstanding-rewards","text":"

Query distribution outstanding (un-withdrawn) rewards for a validator and all their delegations.

Usage:\n  stchaind query distribution validator-outstanding-rewards [validator] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for validator-outstanding-rewards\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query distribution validator-outstanding-rewards stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-community-pool","title":"-community-pool","text":"

Query all coins in the community pool which is under Governance control.

Usage:\n  stchaind query distribution community-pool [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for community-pool\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query distribution community-pool --height=9765\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-slashes","title":"-slashes","text":"

Query all slashes of a validator for a given block range.

Usage:\n  stchaind query distribution slashes [validator] [start-height] [end-height] [flags]\n\nFlags:\n      --count-total       count total number of records in validator slashes to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for slashes\n      --limit uint        pagination limit of validator slashes to query for (default 100)\n      --offset uint       pagination offset of validator slashes to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of validator slashes to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of validator slashes to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query distribution slashes stvaloper1095s2f3m60qz48spy3wr52gw8xmy7xqywnxnrq 0 500\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-distribution-params","title":"-distribution-params","text":"

Query distribution params.

Usage:\n  stchaind query distribution params [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for params\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query distribution params\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#gov-module","title":"Gov Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-submit-proposal","title":"-submit-proposal","text":"

Submit a proposal along with an initial deposit. Proposal title, description, type and deposit can be given directly or through a proposal JSON file.

Except for itself, the command submit-proposal also provides three sub-commands, param-change, community-pool-spend and software-upgrade, to submit a proposal for changing global parameters, distributing funds in community-pool and upgrading software.

Usage:\n  stchaind tx gov submit-proposal [flags]\n  stchaind tx gov submit-proposal [command]\n\nAvailable Commands:\n  cancel-software-upgrade Cancel the current software upgrade proposal\n  community-pool-spend    Submit a community pool spend proposal\n  param-change            Submit a parameter change proposal\n  software-upgrade        Submit a software upgrade proposal\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --deposit string        The proposal deposit\n      --description string    The proposal description\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for submit-proposal\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n      --proposal string       Proposal file path (if this path is given, other proposal flags are ignored)\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n      --title string          The proposal title\n      --type string           The proposal Type\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n\n  In testing phase, --keyring-backend=\"test\"\n

  • submit-proposal example:
Usage:\nstchaind tx gov submit-proposal <proposal.json> --from=<Name|address of private key>\n

Where proposal.json contains:

    {\n      \"title\": \"Test Proposal\",\n      \"description\": \"My awesome proposal\",\n      \"type\": \"Text\",\n      \"deposit\": \"100000000000gwei\"\n    }\n

Which is equivalent to:

stchaind tx gov submit-proposal \\\n--title=\"Test Proposal\" \\\n--description=\"My awesome proposal\" \\\n--type=\"Text\" \\\n--deposit=\"100000000000gwei\" \\\n--from=<name|address of private key>\n

submit-proposal Tx command:

stchaind tx gov submit-proposal \\\n--title=\"Test Proposal\" \\\n--description=\"My awesome proposal\" \\\n--type=\"Text\" \\\n--deposit=\"100000000000gwei\" \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1  \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

  • param-change example:

Submit a parameter proposal along with an initial deposit. The proposal details must be supplied via a JSON file. For values that contains objects, only non-empty fields will be updated.

Usage:\nstchaind tx gov submit-proposal param-change [proposal-file] [flags]\n

param-change example tx command:

stchaind tx gov submit-proposal param-change <proposal-file> \\\n--from=<name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend'> \\\n--gas=auto --gas-prices=1000000000wei\n

A sample of param_change.json could be:

{\n    \"title\": \"Param-Change\",\n    \"description\": \"This is a test to update deposit params in gov Module\",\n    \"changes\": [\n        {\n            \"subspace\": \"gov\",\n            \"key\": \"depositparams\",\n            \"value\": {\"max_deposit_period\":\"72800000000000\"}\n        }\n    ],\n    \"deposit\": \"1000000000000gwei\"\n}\n

param-change tx command:

stchaind tx gov submit-proposal param-change ./helpers/param_change.json \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

  • community-pool-spend example:

Submit a community pool spend proposal along with an initial deposit. The proposal details must be supplied via a JSON file.

Usage:\nstchaind tx gov submit-proposal community-pool-spend [proposal-file] [flags]\n

The proposal.json could be:

    {\n      \"title\": \"Community Pool Spend\",\n      \"description\": \"Pay me some STOSes!\",\n      \"recipient\": \"st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\",\n      \"amount\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"1000000000000\"\n        }\n      ],\n      \"deposit\": [\n        {\n          \"denom\": \"gwei\",\n          \"amount\": \"1000000000000\"\n        }\n      ]\n    }\n

community-pool-spend tx command:

stchaind tx gov submit-proposal community-pool-spend ./helpers/proposal.json \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

  • software-upgrade example:

Submit a software upgrade along with an initial deposit.

Usage:\n  stchaind tx gov submit-proposal software-upgrade [name] (--upgrade-height [height]) (--upgrade-info [info]) [flags]\n

software-upgrade tx command:

stchaind tx gov submit-proposal software-upgrade=\"v0.3.1\" \\\n--upgrade-height=1000 \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--description=test1 \\\n--title=test1 \\\n--deposit=100000000000gwei \\\n--info=testinfo \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-deposit","title":"-deposit","text":"

Deposit tokens for an active proposal by proposal-id which can be found with the command stchaind query gov proposals.

Usage:\n  stchaind tx gov deposit [proposal-id] [deposit] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for deposit\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx gov deposit 7 100000000gwei \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-vote-transaction","title":"-vote (transaction)","text":"

Submit a vote for an active proposal. Vote options include yes/no/no_with_veto/abstain.

Usage:\n  stchaind tx gov vote [proposal-id] [option] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for vote\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n    In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx gov vote 7 yes \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-proposal","title":"-proposal","text":"

Query details for a proposal. You can find the proposal-id by running stchaind query gov proposals

Usage:\n  stchaind query gov proposal [proposal-id] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for proposal\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query gov proposal 7\n

Result:

content:\n  title: Param-Change Staking MaxValidators to 100\n  description: This is a test to update MaxValidators to 100 in staking Module\n  changes:\n  - subspace: staking\n    key: MaxValidators\n    value: \"100\"\nid: 7\nproposal_status: 3\nfinal_tally_result:\n  \"yes\": \"400000000\"\n  abstain: \"0\"\n  \"no\": \"0\"\n  no_with_veto: \"0\"\nsubmit_time: 2021-07-23T14:40:04.976927421Z\ndeposit_end_time: 2021-07-23T14:41:44.976927421Z\ntotal_deposit:\n- denom: wei\n  amount: \"100010000000000000000\"\nvoting_start_time: 2021-07-23T14:40:41.961523583Z\nvoting_end_time: 2021-07-23T14:42:21.961523583Z\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-proposals","title":"-proposals","text":"

Query details of all proposals with optional filters(flags).

Usage:\n  stchaind query gov proposals [flags]\n\nFlags:\n      --count-total        count total number of records in proposals to query for\n      --depositor string   (optional) filter by proposals deposited on by depositor\n      --height int         Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help               help for proposals\n      --limit uint         pagination limit of proposals to query for (default 100)\n      --offset uint        pagination offset of proposals to query for\n  -o, --output string      Output format (text|json) (default \"text\")\n      --page uint          pagination page of proposals to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string    pagination page-key of proposals to query for\n      --reverse            results are sorted in descending order\n      --status string      (optional) filter proposals by proposal status, status: deposit_period/voting_period/passed/rejected\n      --voter string       (optional) filter by proposals voted on by voted\n\n    stchaind query gov proposals --depositor st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n    stchaind query gov proposals --voter st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n    stchaind query gov proposals --status (DepositPeriod|VotingPeriod|Passed|Rejected)\n    stchaind query gov proposals --page=2 --limit=100\n

Example:

stchaind query gov proposals\n

Result:

- content:\n    title: Param-Change Staking MaxValidators to 5\n    description: This is a test to update MaxValidators to 5 in staking Module\n    changes:\n    - subspace: staking\n      key: MaxValidators\n      value: \"5\"\n  id: 1\n  proposal_status: 3\n  final_tally_result:\n    \"yes\": \"383333332\"\n    abstain: \"0\"\n    \"no\": \"0\"\n    no_with_veto: \"0\"\n  submit_time: 2021-07-19T15:38:08.619640056Z\n  deposit_end_time: 2021-07-19T15:39:48.619640056Z\n  total_deposit:\n  - denom: wei\n    amount: \"100010000000000000000\"\n  voting_start_time: 2021-07-19T15:38:23.789218262Z\n  voting_end_time: 2021-07-19T15:40:03.789218262Z\n\n...\n\n- content:\n    title: Param-Change Staking MaxValidators to 100\n    description: This is a test to update MaxValidators to 100 in staking Module\n    changes:\n    - subspace: staking\n      key: MaxValidators\n      value: \"100\"\n  id: 7\n  proposal_status: 3\n  final_tally_result:\n    \"yes\": \"400000000\"\n    abstain: \"0\"\n    \"no\": \"0\"\n    no_with_veto: \"0\"\n  submit_time: 2021-07-23T14:40:04.976927421Z\n  deposit_end_time: 2021-07-23T14:41:44.976927421Z\n  total_deposit:\n  - denom: wei\n    amount: \"100010000000000000000\"\n  voting_start_time: 2021-07-23T14:40:41.961523583Z\n  voting_end_time: 2021-07-23T14:42:21.961523583Z\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-vote-query","title":"-vote (query)","text":"

Query details for a single vote on a proposal given its identifier.

Usage:\n  stchaind query gov vote [proposal-id] [voter-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for vote\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query gov vote 7 st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n

Result:

proposal_id: 7\nvoter: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\noption: 1\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-votes","title":"-votes","text":"

Query vote details for a single proposal by its identifier.

Usage:\n  stchaind query gov votes [proposal-id] [flags]\n\nFlags:\n      --count-total       count total number of records in votes to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for votes\n      --limit uint        pagination limit of votes to query for (default 100)\n      --offset uint       pagination offset of votes to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of votes to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of votes to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query gov votes 7\n

Result:

- proposal_id: 7\n  voter: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n  option: 1\n- proposal_id: 7\n  voter: st1m4f4hnyfhpaeqlcgv7lfhgzjwmrvfeggwnpygz\n  option: 1\n- proposal_id: 7\n  voter: st1kuhyf59qvukk8r5manky062d6c66utvytm7az6\n  option: 1\n- proposal_id: 7\n  voter: st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\n  option: 1\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-deposit_1","title":"-deposit","text":"

Query details for a single proposal deposit on a proposal by its identifier.

Usage:\n  stchaind query gov deposit [proposal-id] [depositer-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for deposit\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query gov deposit 7 st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n

Result:

proposal_id: 7\ndepositor: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\namount:\n- denom: wei\n  amount: \"100000000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-deposits","title":"-deposits","text":"

Query details for all deposits on a proposal.

Usage:\n  stchaind query gov deposits [proposal-id] [flags]\n\nFlags:\n      --count-total       count total number of records in deposits to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for deposits\n      --limit uint        pagination limit of deposits to query for (default 100)\n      --offset uint       pagination offset of deposits to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of deposits to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of deposits to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query gov deposits 7\n

Result:

- proposal_id: 7\n  depositor: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n  amount:\n  - denom: wei\n    amount: \"100000000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#slashing-module","title":"Slashing Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-unjail","title":"-unjail","text":"

Unjail a jailed validator.

Usage:\n  stchaind tx slashing unjail [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for unjail\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx slashing unjail \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-signing-info","title":"-signing-info","text":"

Use a validators' consensus public key to find the signing-info for that validator.

Usage:\n  stchaind query slashing signing-info [validator-conspub] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for signing-info\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query slashing signing-info stvalconspub1zcjduepqsnwlx7rv0ghyvh9tm99zle39df99jt8hccwt8jdrvjs26zqrzh9shdmgyc\n

Result:

address: stvalcons1sa58sznp26ftquypx994q2eurq6qy38tfm3rn3\nstart_height: 0\nindex_offset: 3874\njailed_until: 1970-01-01T00:00:00Z\ntombstoned: false\nmissed_blocks_counter: 0\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-slashing-params","title":"-slashing-params","text":"

Query genesis parameters for the slashing module.

Usage:\n  stchaind query slashing params [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for params\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query slashing params\n

Result:

signed_blocks_window: 10000\nmin_signed_per_window: \"0.500000000000000000\"\ndowntime_jail_duration: 10m0s\nslash_fraction_double_sign: \"0.050000000000000000\"\nslash_fraction_downtime: \"0.010000000000000000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#staking-module","title":"Staking Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-delegate","title":"-delegate","text":"

Delegate an amount of liquid coins to a validator from your wallet.

Usage:\n  stchaind tx staking delegate [validator-addr] [amount] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for delegate\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx staking delegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k 1000gwei \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-redelegate","title":"-redelegate","text":"

Redelegate an amount of illiquid staking tokens from one validator to another.

Usage:\n  stchaind tx staking redelegate [src-validator-addr] [dst-validator-addr] [amount] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for redelegate\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx staking redelegate stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k stvaloper1gtw399h9vfnekqsz3dg4n6mj0qgdpnh30x66xa 1000gwei \\\n--from=st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-unbond","title":"-unbond","text":"

Unbond an amount of bonded shares from a validator.

Usage:\n  stchaind tx staking unbond [validator-addr] [amount] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for unbond\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

stchaind tx staking unbond stvaloper12adksjsd7gcsn23h5jmvdygzx2lfw5q4pyf57u 10000gwei \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-create-validator","title":"-create-validator","text":"

Create new validator initialized with a self-delegation to it.

Usage:\n  stchaind tx staking create-validator [flags]\n\nFlags:\n  -a, --account-number uint                 The account number of the signing account (offline mode only)\n      --amount string                       Amount of coins to bond\n      --commission-max-change-rate string   The maximum commission change rate percentage (per day)\n      --commission-max-rate string          The maximum commission rate percentage\n      --commission-rate string              The initial commission rate percentage\n      --details string                      The validator's (optional) details\n      --dry-run                             ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string                  Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                          gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only                       Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                                help for create-validator\n      --identity string                     The optional identity signature (ex. UPort or Keybase)\n      --ip string                           The node's public IP. It takes effect only when used in combination with --generate-only\n      --keyring-dir string                  The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                              Use a connected Ledger device\n      --min-self-delegation string          The minimum self delegation required on the validator\n      --moniker string                      The validator's name\n      --node-id string                      The node's ID\n      --note string                         Note to add a description to the transaction (previously --memo)\n      --offline                             Offline mode (does not allow any online functionality\n  -o, --output string                       Output format (text|json) (default \"json\")\n      --pubkey string                       The validator's Protobuf JSON encoded public key\n      --security-contact string             The validator's (optional) security contact email\n  -s, --sequence uint                       The sequence number of the signing account (offline mode only)\n      --sign-mode string                    Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint                 Set a block timeout height to prevent the tx from being committed past a certain height\n      --website string                      The validator's (optional) website\n  -y, --yes                                 Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Tip

  • moniker: the validator's name
  • pubkey: the private key associated with this Tendermint PubKey is used to sign prevotes and precommits
  • website: website(Optional)
  • description: description(Optional)
  • commission-rate: the commission rate on block rewards and fees charged to delegators
  • commission-max-rate: the maximum commission rate which this validator can charge. This parameter cannot be changed after create-validator is processed.
  • commission-max-change-rate: the maximum daily increase of the validator commission. This parameter cannot be changed after create-validator is processed.
  • min-self-delegation: minimum amount of tokens the validator needs to have bonded at all time. If the validator's self-delegated stake falls below this limit, their entire staking pool will unbond.
  • amount: the amount of tokens to be bonded to the validator at creation. This value should be greater than the value of min-self-delegation

Example:

stchaind tx staking create-validator \\\n--amount=100stos \\\n--pubkey='{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"JwtmYzaX0b+zjuDypUI2+qy8wa/LFtUUUg0+vr11tpg=\"}' \\\n--moniker=\"myValidator\" \\\n--commission-rate=0.10 \\\n--commission-max-rate=0.20 \\\n--commission-max-change-rate=0.01 \\\n--min-self-delegation=1 \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--chain-id=mesos-1 --keyring-backend=test --gas=auto --gas-prices=1000000000wei -y \n

The value of --pubkey can be retrieved by using the command stchaind tendermint show-validator

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-edit-validator","title":"-edit-validator","text":"

Edit an existing validator account.

Usage:\n  stchaind tx staking edit-validator [flags]\n\nFlags:\n  -a, --account-number uint          The account number of the signing account (offline mode only)\n      --commission-rate string       The new commission rate percentage\n      --details string               The validator's (optional) details (default \"[do-not-modify]\")\n      --dry-run                      ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string           Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                   gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only                Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                         help for edit-validator\n      --identity string              The (optional) identity signature (ex. UPort or Keybase) (default \"[do-not-modify]\")\n      --keyring-dir string           The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                       Use a connected Ledger device\n      --min-self-delegation string   The minimum self delegation required on the validator\n      --moniker string               The validator's name (default \"[do-not-modify]\")\n      --note string                  Note to add a description to the transaction (previously --memo)\n      --offline                      Offline mode (does not allow any online functionality\n  -o, --output string                Output format (text|json) (default \"json\")\n      --security-contact string      The validator's (optional) security contact email (default \"[do-not-modify]\")\n  -s, --sequence uint                The sequence number of the signing account (offline mode only)\n      --sign-mode string             Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint          Set a block timeout height to prevent the tx from being committed past a certain height\n      --website string               The validator's (optional) website (default \"[do-not-modify]\")\n  -y, --yes                          Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Tip

  • min_self_delegation allows to increase only
  • commission-max-rate cannot be changed after create-validator
  • commission-max-change-ratecannot be changed after create-validator

Example:

stchaind tx staking edit-validator \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--keyring-backend=test \\\n--min-self-delegation=100  \\\n--memo=\"Change 'min-self-delegation' from 1 to 100\" \\\n--chain-id=mesos-1  --keyring-backend=test --gas=auto --gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-delegation","title":"-delegation","text":"

Query a delegation based on delegator address and validator address.

Usage:\n  stchaind query staking delegation [delegator-addr] [validator-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for delegation\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query staking delegation st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k\n

Result:

delegation:\n  delegator_address: st1fmdh9vf262qxe5ehmp9jvgkqzaeye4qm372rda\n  validator_address: stvaloper1fmdh9vf262qxe5ehmp9jvgkqzaeye4qmxjrr3k\n  shares: \"100000000000000000000.000000000000000000\"\nbalance:\n  denom: wei\n  amount: \"1000000000000000000000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-delegations","title":"-delegations","text":"

Query delegations for an individual delegator on all validators.

Usage:\n  stchaind query staking delegations [delegator-addr] [flags]\n\nFlags:\n      --count-total       count total number of records in delegations to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for delegations\n      --limit uint        pagination limit of delegations to query for (default 100)\n      --offset uint       pagination offset of delegations to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of delegations to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of delegations to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query staking delegations st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n

Result:

delegation_responses:\n- balance:\n    amount: \"500000000000\"\n    denom: wei\n  delegation:\n    delegator_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n    shares: \"500000000000.000000000000000000\"\n    validator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\npagination:\n  next_key: null\n  total: \"0\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-delegations-to","title":"-delegations-to","text":"

Query all delegations made to one validator.

Usage:\n  stchaind query staking delegations-to [validator-addr] [flags]\n\nFlags:\n      --count-total       count total number of records in validator delegations to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for delegations-to\n      --limit uint        pagination limit of validator delegations to query for (default 100)\n      --offset uint       pagination offset of validator delegations to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of validator delegations to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of validator delegations to query for\n      --reverse           results are sorted in descending ord\n

Example:

stchaind query staking delegations-to stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n

Result:

delegation_responses:\n- balance:\n    amount: \"500000000000\"\n    denom: wei\n  delegation:\n    delegator_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n    shares: \"500000000000.000000000000000000\"\n    validator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\npagination:\n  next_key: null\n  total: \"0\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-unbonding-delegations","title":"-unbonding-delegations","text":"

Query unbonding delegations for an individual delegator.

Usage:\n  stchaind query staking unbonding-delegations [delegator-addr] [flags]\n\nFlags:\n      --count-total       count total number of records in unbonding delegations to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for unbonding-delegations\n      --limit uint        pagination limit of unbonding delegations to query for (default 100)\n      --offset uint       pagination offset of unbonding delegations to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of unbonding delegations to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of unbonding delegations to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind q staking unbonding-delegations st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2\n

Result:

- delegator_address: st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2\n  validator_address: stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p\n  entries:\n  - creation_height: 5805\n    completion_time: 2021-08-30T19:53:31.144199109Z\n    initial_balance: \"10000\"\n    balance: \"10000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-unbonding-delegation","title":"-unbonding-delegation","text":"

Query unbonding delegations for an individual delegator on an individual validator.

Usage:\n  stchaind query staking unbonding-delegation [delegator-addr] [validator-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for unbonding-delegation\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example

stchaind q staking unbonding-delegation st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2 stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-unbonding-delegations-from","title":"-unbonding-delegations-from","text":"

Query all unbonding delegatations from a validator.

Usage:\n  stchaind query staking unbonding-delegations-from [validator-addr] [flags]\n\nFlags:\n      --count-total       count total number of records in unbonding delegations to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for unbonding-delegations-from\n      --limit uint        pagination limit of unbonding delegations to query for (default 100)\n      --offset uint       pagination offset of unbonding delegations to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of unbonding delegations to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of unbonding delegations to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query staking unbonding-delegations-from stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p\n

Result:

- delegator_address: st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2\n  validator_address: stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p\n  entries:\n  - creation_height: 5805\n    completion_time: 2021-08-30T19:53:31.144199109Z\n    initial_balance: \"10000\"\n    balance: \"10000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-redelegation","title":"-redelegation","text":"

Query a redelegation record based on delegator and a source and destination validator address.

Usage:\n  stchaind query staking redelegation [delegator-addr] [src-validator-addr] [dst-validator-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for redelegation\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query staking redelegation st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76 stvaloper1gamc7ajhzukp08nle9z9asyfx4u4dlz53dquzj stvaloper1zgqhnz69jppcwg9z27vtq3zq9r3du5v6vjqvpq\n

Result:

- redelegation:\n    delegator_address: st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76\n    validator_src_address: stvaloper1gamc7ajhzukp08nle9z9asyfx4u4dlz53dquzj\n    validator_dst_address: stvaloper1zgqhnz69jppcwg9z27vtq3zq9r3du5v6vjqvpq\n    entries: []\n  entries:\n  - redelegationentry:\n      creation_height: 1909\n      completion_time: 2021-09-02T19:33:26.890343914Z\n      initial_balance: \"10000\"\n      shares_dst: \"10000.000000000000000000\"\n    balance: \"10000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-redelegations","title":"-redelegations","text":"

Query all redelegations records for one delegator.

Usage:\n  stchaind query staking redelegations [delegator-addr] [flags]\n\nFlags:\n      --count-total       count total number of records in delegator redelegations to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for redelegations\n      --limit uint        pagination limit of delegator redelegations to query for (default 100)\n      --offset uint       pagination offset of delegator redelegations to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of delegator redelegations to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of delegator redelegations to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query staking redelegations st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76\n

Result:

- redelegation:\n    delegator_address: st15xlpwafgnvvs5hdk8938dp2ve6cjmy4vcf4l76\n    validator_src_address: stvaloper1gamc7ajhzukp08nle9z9asyfx4u4dlz53dquzj\n    validator_dst_address: stvaloper1zgqhnz69jppcwg9z27vtq3zq9r3du5v6vjqvpq\n    entries: []\n  entries:\n  - redelegationentry:\n      creation_height: 1909\n      completion_time: 2021-09-02T19:33:26.890343914Z\n      initial_balance: \"10000\"\n      shares_dst: \"10000.000000000000000000\"\n    balance: \"10000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-redelegations-from","title":"-redelegations-from","text":"

Query all unbonding delegatations from a validator.

Usage:\n  stchaind query staking unbonding-delegations-from [validator-addr] [flags]\n\nFlags:\n      --count-total       count total number of records in unbonding delegations to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for unbonding-delegations-from\n      --limit uint        pagination limit of unbonding delegations to query for (default 100)\n      --offset uint       pagination offset of unbonding delegations to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of unbonding delegations to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of unbonding delegations to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query staking unbonding-delegations-from stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p\n

Result:

- delegator_address: st1xnhfx7c0nev9me835409efjj7whd672xs6d2m2\n  validator_address: stvaloper1xnhfx7c0nev9me835409efjj7whd672x8ky28p\n  entries:\n  - creation_height: 5805\n    completion_time: 2021-08-30T19:53:31.144199109Z\n    initial_balance: \"10000\"\n    balance: \"10000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-historical-info","title":"-historical-info","text":"

Query historical info at given height.

Usage:\n  stchaind query staking historical-info [height] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for historical-info\n  -o, --output string   Output format (text|json) (default \"text\")\n
Note:\nThe response of `historical-info` is depended on the `skating` parameter `HistoricalEntries`. \nIf `HistoricalEntries` is \"0\", the response will always be\n\nERROR: no historical info found\n

Example:

stchaind query staking historical-info 300\n

Result:

header:\n  app_hash: fun5OdjHvsMZU1g+mcpgnfDuVBDSTTQjrTjJ3jvEkpo=\n  chain_id: test-chain\n  consensus_hash: BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=\n  data_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\n  evidence_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\n  height: \"300\"\n  last_block_id:\n    hash: heoL6s+ZfzE4xdhvUuKe5OKppwYIklXVvV+hDQe17G0=\n    part_set_header:\n      hash: wHoreN7ckwhF3a4dTDRKi47wvrIq0gme2AgNXBf/E3U=\n      total: 1\n  last_commit_hash: sk5idFtJj7qZFHyVbQ/PsB/TQfovdKn2SEekPWF7ZJc=\n  last_results_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\n  next_validators_hash: UjS9kaOnUeBVw1h2V43kpGYxGoDVQLWYha9o721NVt4=\n  proposer_address: GKcWnBtCfZlBM/ez1FBOknids3w=\n  time: \"2023-01-11T00:51:55.887814534Z\"\n  validators_hash: UjS9kaOnUeBVw1h2V43kpGYxGoDVQLWYha9o721NVt4=\n  version:\n    app: \"0\"\n    block: \"11\"\nvalset:\n- commission:\n    commission_rates:\n      max_change_rate: \"0.010000000000000000\"\n      max_rate: \"0.200000000000000000\"\n      rate: \"0.100000000000000000\"\n    update_time: \"2023-01-09T17:08:58.489050300Z\"\n  consensus_pubkey:\n    '@type': /cosmos.crypto.ed25519.PubKey\n    key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\n  delegator_shares: \"500000000000.000000000000000000\"\n  description:\n    details: \"\"\n    identity: \"\"\n    moniker: node\n    security_contact: \"\"\n    website: \"\"\n  jailed: false\n  min_self_delegation: \"1\"\n  operator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n  status: BOND_STATUS_BONDED\n  tokens: \"500000000000\"\n  unbonding_height: \"0\"\n  unbonding_time: \"1970-01-01T00:00:00Z\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-pool","title":"-pool","text":"

Query values for amounts stored in the staking pool.

Usage:\n  stchaind query staking pool [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for pool\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query staking pool\n

Result:

bonded_tokens: \"500000000000\"\nnot_bonded_tokens: \"0\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-staking-params","title":"-staking-params","text":"

Query values set as staking parameters.

Usage:\n  stchaind query staking params [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for params\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query staking params\n

Result:

bond_denom: wei\nhistorical_entries: 10000\nmax_entries: 7\nmax_validators: 100\nunbonding_time: 1814400s\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-validator","title":"-validator","text":"

Query details about an individual validator

Usage:\n  stchaind query staking validator [validator-addr] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for validator\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query staking validator stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n

Result:

- |\ncommission:\n  commission_rates:\n    max_change_rate: \"0.010000000000000000\"\n    max_rate: \"0.200000000000000000\"\n    rate: \"0.100000000000000000\"\n  update_time: \"2023-01-09T17:08:58.489050300Z\"\nconsensus_pubkey:\n  '@type': /cosmos.crypto.ed25519.PubKey\n  key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\ndelegator_shares: \"500000000000.000000000000000000\"\ndescription:\n  details: \"\"\n  identity: \"\"\n  moniker: node\n  security_contact: \"\"\n  website: \"\"\njailed: false\nmin_self_delegation: \"1\"\noperator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\nstatus: BOND_STATUS_BONDED\ntokens: \"500000000000\"\nunbonding_height: \"0\"\nunbonding_time: \"1970-01-01T00:00:00Z\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-1/#-validators","title":"-validators","text":"

Query values for amounts stored in the staking pool.

Usage:\n  stchaind query staking validators [flags]\n\nFlags:\n      --count-total       count total number of records in validators to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for validators\n      --limit uint        pagination limit of validators to query for (default 100)\n      --offset uint       pagination offset of validators to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of validators to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of validators to query for\n      --reverse           results are sorted in descending order\n

Example:

stchaind query staking validators\n

Result:

- |\npagination:\n  next_key: null\n  total: \"0\"\nvalidators:\n- commission:\n    commission_rates:\n      max_change_rate: \"0.010000000000000000\"\n      max_rate: \"0.200000000000000000\"\n      rate: \"0.100000000000000000\"\n    update_time: \"2023-01-09T17:08:58.489050300Z\"\n  consensus_pubkey:\n    '@type': /cosmos.crypto.ed25519.PubKey\n    key: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\n  delegator_shares: \"500000000000.000000000000000000\"\n  description:\n    details: \"\"\n    identity: \"\"\n    moniker: node\n    security_contact: \"\"\n    website: \"\"\n  jailed: false\n  min_self_delegation: \"1\"\n  operator_address: stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n  status: BOND_STATUS_BONDED\n  tokens: \"500000000000\"\n  unbonding_height: \"0\"\n  unbonding_time: \"1970-01-01T00:00:00Z\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/","title":"Stratos Chain stchaind commands part 2","text":"

This document is the second part of stchaind commands for Stratos Chain.

  • Bank
  • Distribution
  • Gov
  • Slashing
  • Staking
  • Register
  • Sds
  • Pot
  • Tendermint
  • Others

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#register-module","title":"Register Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-create-resource-node","title":"-create-resource-node","text":"

Create a new resource node

Usage:\n  stchaind tx register create-resource-node [flags]\n\nFlags:\n  -a, --account-number uint       The account number of the signing account (offline mode only)\n      --amount string             Amount of coins to bond\n      --details string            The node's (optional) details\n      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                      help for create-resource-node\n      --identity string           The (optional) identity signature (ex. UPort or Keybase)\n      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                    Use a connected Ledger device\n      --moniker string            The node's name\n      --network-address string    The address of the PP node\n      --node-type uint32          The value of node_type is determined by the three node types (storage=4/database=2/computation=1) and their arbitrary combinations.\n      --note string               Note to add a description to the transaction (previously --memo)\n      --offline                   Offline mode (does not allow any online functionality\n  -o, --output string             Output format (text|json) (default \"json\")\n      --pubkey string             The resource node's Protobuf JSON encoded public key\n      --security-contact string   The node's (optional) security contact email\n  -s, --sequence uint             The sequence number of the signing account (offline mode only)\n      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height\n      --website string            The node's (optional) website\n  -y, --yes                       Skip tx broadcasting prompt confirmation\n\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register create-resource-node \\\n--network-address=<network-address> \\\n--amount=<amount> \\\n--pubkey=<pubkey of resource node> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--moniker=<name of resource node> \\\n--node-type=<resource node type, int 1~7>\n

Transaction example:

 stchaind tx register create-resource-node \\\n --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \\\n --amount=10stos \\\n --pubkey=stsdspub1zcjduepqmrsput8d8c4tqeztrwzjjntg0jdgvmuyd5pur2g0chpxv5cccdsq4drddm \\\n --from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n --moniker=resource-node0 \\\n --node-type=1 \\\n --chain-id=mesos-1 \\\n --keyring-backend=test \\\n --gas=auto \\\n --gas-prices=1000000000wei -y\n

There are three ways to check if the new resource node is in the resource-node list:

  • Client Command
  • REST API
  • GRPC Command

Client Command:

stchaind query register get-resource-node --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\n

Response:

creation_time: \"2023-01-10T16:48:24.591781632Z\"\ndescription:\n  details: \"\"\n  identity: \"\"\n  moniker: resource-node0\n  security_contact: \"\"\n  website: \"\"\nnetwork_address: stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\nnode_type: 1\nowner_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\npubkey:\n  '@type': /cosmos.crypto.ed25519.PubKey\n  key: 2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\nstatus: BOND_STATUS_BONDED\nsuspend: true\ntokens: \"10000000000000000000\"\n

REST API:

http://127.0.0.1:1317/register/deposit/address/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\n

Response:

{\n  \"height\": \"7\",\n  \"result\": {\n    \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n    \"pubkey\": {\n      \"type\": \"tendermint/PubKeyEd25519\",\n      \"value\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n    },\n    \"suspend\": true,\n    \"status\": 3,\n    \"tokens\": \"10000000000000000000\",\n    \"owner_address\": \"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\",\n    \"description\": {\n      \"moniker\": \"resource-node0\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"2023-01-10T16:48:24.591781632Z\",\n    \"node_type\": 1,\n    \"bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"10000000000000000000\"\n    },\n    \"un_bonding_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    },\n    \"un_bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    }\n  }\n}\n

GRPC Command:

grpcurl -plaintext -d '{\"network_addr\":\"stsds1m9fhlyy2eug7kcgrqfdxxxvnscp5qdvut6g4xz\",\"query_type\":\"0\" }' 127.0.0.1:9090 stratos.register.v1.Query.DepositByNode\n

Note:

query_type     = 0   query the deposit info of both resource nodes or meta and nodes with this account address\nquery_type     = 1   query the deposit info of only meta node with this account address\nquery_type     = 2   query the deposit info of only resource node with this account address\n

Response:

{\n  \"deposit_info\": {\n    \"network_address\": \"stsds1m9fhlyy2eug7kcgrqfdxxxvnscp5qdvut6g4xz\",\n    \"pubkey\": {\n      \"type_url\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"value\": \"CiD37kGSAjc+jRvAqaphnkKNarZo6KePzYmp1ViQxMHVvg==\"\n    },\n    \"suspend\": true,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"2003000000000000000000\",\n    \"owner_address\": \"st18986jyng5vsprmtzkdxla80jrw7qyc6wl73h0u\",\n    \"description\": {\n      \"moniker\": \"stsds1m9fhlyy2eug7kcgrqfdxxxvnscp5qdvut6g4xz\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": {\n      \"seconds\": \"1685729968\",\n      \"nanos\": 908306425\n    },\n    \"node_type\": 4,\n    \"bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"2003000000000000000000\"\n    },\n    \"un_bonding_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    },\n    \"un_bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    }\n  }\n}\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-update-resource-node","title":"-update-resource-node","text":"

Update a resource node info

Usage:\n  stchaind tx register update-resource-node [flags]\n\nFlags:\n  -a, --account-number uint       The account number of the signing account (offline mode only)\n      --details string            The node's (optional) details\n      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                      help for update-resource-node\n      --identity string           The (optional) identity signature (ex. UPort or Keybase)\n      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                    Use a connected Ledger device\n      --moniker string            The node's name\n      --network-address string    The address of the PP node\n      --node-type uint32          The value of node_type is determined by the three node types (storage=4/database=2/computation=1) and their arbitrary combinations.\n      --note string               Note to add a description to the transaction (previously --memo)\n      --offline                   Offline mode (does not allow any online functionality\n  -o, --output string             Output format (text|json) (default \"json\")\n      --security-contact string   The node's (optional) security contact email\n  -s, --sequence uint             The sequence number of the signing account (offline mode only)\n      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height\n      --website string            The node's (optional) website\n  -y, --yes                       Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register update-resource-node \\\n--network-address=<resourceNode_address> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--moniker=<name of resource node> \\\n--node-type=<resource node type, int 1~7>\n

Transaction example:

stchaind tx register update-resource-node \\\n--network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--moniker=resource-nodeupdate \\\n--node-type=7 \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

Check if the new resource node info has been updated.

stchaind query register get-resource-node --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\n

Response:

creation_time: \"2023-01-10T18:16:14.738068297Z\"\ndescription:\n  details: \"\"\n  identity: \"\"\n  moniker: resource-nodeupdate\n  security_contact: \"\"\n  website: \"\"\nnetwork_address: stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\nnode_type: 7\nowner_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\npubkey:\n  '@type': /cosmos.crypto.ed25519.PubKey\n  key: 2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\nstatus: BOND_STATUS_BONDED\nsuspend: true\ntokens: \"10000000000000000000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-update-resource-node-deposit","title":"-update-resource-node-deposit","text":"

update resource node's deposit

Usage:\n  stchaind tx register update-resource-node-deposit [flags]\n\nFlags:\n  -a, --account-number uint      The account number of the signing account (offline mode only)\n      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string       Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string               gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                     help for update-resource-node-deposit\n      --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                   Use a connected Ledger device\n      --network-address string   The address of the PP node\n      --note string              Note to add a description to the transaction (previously --memo)\n      --offline                  Offline mode (does not allow any online functionality\n  -o, --output string            Output format (text|json) (default \"json\")\n  -s, --sequence uint            The sequence number of the signing account (offline mode only)\n      --sign-mode string         Choose sign mode (direct|amino-json), this is an advanced feature\n      --deposit-delta string     Deposit change of coins to be made (always positive like 100000gwei)\n      --timeout-height uint      Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                      Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register update-resource-node-deposit \\\n--network-address=<resource_node_address> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--deposit-delta=<delta_amount> \\\n--gas=auto\n

Transaction example:

stchaind tx register update-resource-node \\\n--network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--moniker=resource-nodeupdate \\\n--node-type=7 --chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-remove-resource-node","title":"-remove-resource-node","text":"

remove a resource node

Usage:\n  stchaind tx register remove-resource-node [flag] [flags]\n\nFlags:\n  -a, --account-number uint      The account number of the signing account (offline mode only)\n      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string       Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string               gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                     help for remove-resource-node\n      --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                   Use a connected Ledger device\n      --network-address string   The address of the PP node\n      --note string              Note to add a description to the transaction (previously --memo)\n      --offline                  Offline mode (does not allow any online functionality\n  -o, --output string            Output format (text|json) (default \"json\")\n  -s, --sequence uint            The sequence number of the signing account (offline mode only)\n      --sign-mode string         Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint      Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                      Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register remove-resource-node \\\n--network-address=<resource_node_address> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

stchaind tx register remove-resource-node \\\n--network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

Check the status update of the resource node

http://127.0.0.1:1317/register/deposit/address/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\n

Response:

    {\n    \"height\": \"173\",\n    \"result\": {\n        \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n        \"pubkey\": {\n            \"type\": \"tendermint/PubKeyEd25519\",\n            \"value\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n        },\n        \"suspend\": true,\n        \"status\": 2,\n        \"tokens\": \"10000000000000000000\",\n        \"owner_address\": \"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\",\n        \"description\": {\n            \"moniker\": \"resource-nodeupdate\",\n            \"identity\": \"\",\n            \"website\": \"\",\n            \"security_contact\": \"\",\n            \"details\": \"\"\n        },\n        \"creation_time\": \"2023-01-10T18:16:14.738068297Z\",\n        \"node_type\": 7,\n        \"bonded_deposit\": {\n            \"denom\": \"wei\",\n            \"amount\": \"0\"\n        },\n        \"un_bonding_deposit\": {\n            \"denom\": \"wei\",\n            \"amount\": \"10000000000000000000\"\n        },\n        \"un_bonded_deposit\": {\n            \"denom\": \"wei\",\n            \"amount\": \"0\"\n        }\n    }\n}\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-create-meta-node","title":"-create-meta-node","text":"

Create a new meta node

Usage:\n  stchaind tx register create-meta-node [flags]\n\nFlags:\n  -a, --account-number uint       The account number of the signing account (offline mode only)\n      --amount string             Amount of coins to bond\n      --details string            The node's (optional) details\n      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                      help for create-meta-node\n      --identity string           The (optional) identity signature (ex. UPort or Keybase)\n      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                    Use a connected Ledger device\n      --moniker string            The node's name\n      --network-address string    The address of the PP node\n      --note string               Note to add a description to the transaction (previously --memo)\n      --offline                   Offline mode (does not allow any online functionality\n  -o, --output string             Output format (text|json) (default \"json\")\n      --pubkey string             The resource node's Protobuf JSON encoded public key\n      --security-contact string   The node's (optional) security contact email\n  -s, --sequence uint             The sequence number of the signing account (offline mode only)\n      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height\n      --website string            The node's (optional) website\n  -y, --yes                       Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register create-meta-node \\\n--network-address=<network-address> \\\n--amount=<amount> \\\n--pubkey=<pubkey of meta node> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--moniker=<name of resource node>\n

Transaction example:

stchaind tx register create-meta-node \\\n--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \\\n--amount=10stos \\\n--pubkey=stsdspub1zcjduepqv7sj69c52rsdu5m8nk6tg4v5y8fh43w2hl9aa7mp3qgr9ym0feyshrc4wv \\\n--from=st12adksjsd7gcsn23h5jmvdygzx2lfw5q4kgq5zh \\\n--moniker=meta-node0 \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-meta-node-reg-vote","title":"-meta-node-reg-vote","text":"

vote for the registration of a new meta node

Usage:\n  stchaind tx register meta-node-reg-vote [flags]\n\nFlags:\n  -a, --account-number uint                The account number of the signing account (offline mode only)\n      --candidate-network-address string    (default \"The network address of the candidate PP node\")\n      --candidate-owner-address string      (default \"The owner address of the candidate PP node\")\n      --dry-run                            ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string                 Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                         gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only                      Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                               help for meta-node-reg-vote\n      --keyring-dir string                 The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                             Use a connected Ledger device\n      --note string                        Note to add a description to the transaction (previously --memo)\n      --offline                            Offline mode (does not allow any online functionality\n      --opinion                            Opinion of the vote for the registration of Meta node.\n  -o, --output string                      Output format (text|json) (default \"json\")\n  -s, --sequence uint                      The sequence number of the signing account (offline mode only)\n      --sign-mode string                   Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint                Set a block timeout height to prevent the tx from being committed past a certain height\n      --voter-network-address string        (default \"The address of the PP node that made the vote.\")\n  -y, --yes                                Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Warning

A newly-created meta node needs 7 days by default to be voted by other active meta nodes

Example:

Usage:\nstchaind tx register meta-node-reg-vote \\\n--candidate-network-address=<candidate-network-address> \\\n--candidate-owner-address=<candidate-owner-address> \\\n--opinion=<true|false> \\\n--voter-network-address=<voter-network-address> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

stchaind tx register meta-node-reg-vote \\\n--candidate-network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--candidate-owner-address=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--opinion=true \\\n--voter-network-address=stsds13yakj2xgzzdfcw7kd5gtfcfv2k6sn5eg4vdfem \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-update-meta-node","title":"-update-meta-node","text":"

Update meta node info

Usage:\n  stchaind tx register update-meta-node [flags]\n\nFlags:\n  -a, --account-number uint       The account number of the signing account (offline mode only)\n      --details string            The node's (optional) details\n      --dry-run                   ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string        Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string                gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only             Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                      help for update-meta-node\n      --identity string           The (optional) identity signature (ex. UPort or Keybase)\n      --keyring-dir string        The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                    Use a connected Ledger device\n      --moniker string            The node's name\n      --network-address string    The address of the PP node\n      --note string               Note to add a description to the transaction (previously --memo)\n      --offline                   Offline mode (does not allow any online functionality\n  -o, --output string             Output format (text|json) (default \"json\")\n      --security-contact string   The node's (optional) security contact email\n  -s, --sequence uint             The sequence number of the signing account (offline mode only)\n      --sign-mode string          Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint       Set a block timeout height to prevent the tx from being committed past a certain height\n      --website string            The node's (optional) website\n  -y, --yes                       Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register update-meta-node \\\n--network-address<network-address> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--moniker=<name of meta node>\n

Transaction example:

stchaind tx register update-meta-node \\\n--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--moniker=meta-node \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-remove-meta-node","title":"-remove-meta-node","text":"

Remove an meta node

Usage:\n  stchaind tx register remove-meta-node <meta_node_address> <owner_address> [flags]\n\nFlags:\n  -a, --account-number uint      The account number of the signing account (offline mode only)\n  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default \"sync\")\n      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fees string              Fees to pay along with transaction; eg: 10gwei\n      --from string              Name or address of private key with which to sign\n      --gas string               gas limit to set per-transaction; set to \"auto\" to calculate required gas automatically (default 200000) (default \"200000\")\n      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)\n      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10gwei)\n      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)\n  -h, --help                     help for remove-meta-node\n      --indent                   Add indent to JSON response\n      --keyring-backend string   Select keyring's backend (os|file|test) (default \"os\")\n      --ledger                   Use a connected Ledger device\n      --memo string              Memo to send along with transaction\n      --node string              <host>:<port> to tendermint rpc interface for this chain (default \"tcp://localhost:26657\")\n  -s, --sequence uint            The sequence number of the signing account (offline mode only)\n      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)\n  -y, --yes                      Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register remove-meta-node \\\n--network-address=<meta_node_address> \\\n--from=owner_address> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--gas=auto\n

Transaction example:

stchaind tx register remove-meta-node \\\n--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

Check if the meta node has been removed from the meta-node list using REST API

stchaind query register get-meta-node --network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca\n

Response:

    node:\n        creation_time: \"2023-01-10T19:45:09.674241234Z\"\n        description:\n        details: \"\"\n        identity: \"\"\n        moniker: meta-node0\n        security_contact: \"\"\n        website: \"\"\n        network_address: stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca\n        owner_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n        pubkey:\n        '@type': /cosmos.crypto.ed25519.PubKey\n        key: Z6EtFxRQ4N5TZ520tFWUIdN6xcq/y977YYgQMpNvTkk=\n        status: BOND_STATUS_UNBONDING\n        suspend: false\n        tokens: \"10000000000000000000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-update-meta-node-deposit","title":"-update-meta-node-deposit","text":"

update meta node's deposit

Usage:\n  stchaind tx register update-meta-node-deposit [flags]\n\nFlags:\n  -a, --account-number uint      The account number of the signing account (offline mode only)\n      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string       Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string               gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                     help for update-meta-node-deposit\n      --incr-deposit string      Boolean indicator of increase/decrease of deposit delta, true for increase and false for decrease\n      --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                   Use a connected Ledger device\n      --network-address string   The address of the PP node\n      --note string              Note to add a description to the transaction (previously --memo)\n      --offline                  Offline mode (does not allow any online functionality\n  -o, --output string            Output format (text|json) (default \"json\")\n  -s, --sequence uint            The sequence number of the signing account (offline mode only)\n      --sign-mode string         Choose sign mode (direct|amino-json), this is an advanced feature\n      --deposit-delta string     Deposit change of coins to be made (always positive like 100000gwei)\n      --timeout-height uint      Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                      Skip tx broadcasting prompt confirmation\n\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register update-meta-node-deposit \\\n--network-address=<meta_node_address> \\\n--from=<owner_address> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--deposit-delta=<delta_amount> \\\n--incr-deposit=<true|false>\n

Transaction example:

stchaind tx register update-meta-node-deposit \\\n--network-address=stsds1faej5w4q6hgnt0ft598dlm408g4p747y4krwca \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--deposit-delta=100gwei \\\n--incr-deposit=true \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-kick-meta-node-vote","title":"-kick-meta-node-vote","text":"

kick specified meta node by other meta nodes

Usage:\n  stchaind tx register kick-meta-node-vote [flags]\n\nFlags:\n  -a, --account-number uint             The account number of the signing account (offline mode only)\n      --aux                             Generate aux signer data instead of sending a tx\n  -b, --broadcast-mode string           Transaction broadcasting mode (sync|async) (default \"sync\")\n      --chain-id string                 The network chain ID\n      --dry-run                         ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it (when enabled, the local Keybase is not accessible)\n      --fee-granter string              Fee granter grants fees for the transaction\n      --fee-payer string                Fee payer pays fees for the transaction instead of deducting from the signer\n      --fees string                     Fees to pay along with transaction; eg: 10uatom\n      --from string                     Name or address of private key with which to sign\n      --gas string                      gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically. Note: \"auto\" option doesn't always report accurate results. Set a valid coin value to adjust the result. Can be used instead of \"fees\". (default 200000)\n      --gas-adjustment float            adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)\n      --gas-prices string               Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom)\n      --generate-only                   Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase only accessed when providing a key name)\n  -h, --help                            help for kick-meta-node-vote\n      --keyring-backend string          Select keyring's backend (os|file|kwallet|pass|test|memory) (default \"os\")\n      --keyring-dir string              The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                          Use a connected Ledger device\n      --node string                     <host>:<port> to tendermint rpc interface for this chain (default \"tcp://localhost:26657\")\n      --note string                     Note to add a description to the transaction (previously --memo)\n      --offline                         Offline mode (does not allow any online functionality)\n      --opinion                         Opinion of the vote for kicking meta node.\n  -o, --output string                   Output format (text|json) (default \"json\")\n  -s, --sequence uint                   The sequence number of the signing account (offline mode only)\n      --sign-mode string                Choose sign mode (direct|amino-json|direct-aux), this is an advanced feature\n      --target-network-address string   The network address of the meta node to be kicked\n      --timeout-height uint             Set a block timeout height to prevent the tx from being committed past a certain height\n      --tip string                      Tip is the amount that is going to be transferred to the fee payer on the target chain. This flag is only valid when used with --aux, and is ignored if the target chain didn't enable the TipDecorator\n      --voter-network-address string    The network address of the meta node that made the vote\n  -y, --yes                             Skip tx broadcasting prompt confirmation\n\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx register kick-meta-node-vote \\\n--voter-network-address=<voter_meta_node_address> \\\n--target-network-address=<target_meta_node_address> \\\n--opinion=<true|false> \\\n--from=<owner_address> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

stchaind tx register kick-meta-node-vote \\\n--voter-network-address=stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64 \\\n--target-network-address=stsds13yakj2xgzzdfcw7kd5gtfcfv2k6sn5eg4vdfem \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1gwei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-get-resource-nodes","title":"-get-resource-nodes","text":"

Query details about an individual resource node by its network address

Usage:\n  stchaind query register get-resource-node [flags]\n\nFlags:\n      --height int               Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help                     help for get-resource-node\n      --network-address string   The address of the PP node\n  -o, --output string            Output format (text|json) (default \"text\"\n

Example:

Query by network-address:

Usage:\nstchaind query register get-resource-node --network-address=<resource_node_address>\n

Transaction example:

stchaind query register get-resource-node --network-address=stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-get-meta-nodes","title":"-get-meta-nodes","text":"

Query all meta nodes by network id or moniker

Usage:\n  stchaind query register get-meta-node [flags]\n\nFlags:\n      --height int               Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help                     help for get-meta-node\n      --network-address string   The address of the PP node\n  -o, --output string            Output format (text|json) (default \"text\")\n

Example:

Query by network address:

Usage:\nstchaind query register get-meta-nodes --network-address=<meta_node_address>\n

Transaction example:

stchaind query register get-meta-node --network-address=stsds14c3em44vlh276cujnr2ez802uyjyeqrrsu9fuh\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-get-resource-count","title":"-get-resource-count","text":"

Query the total number of bonded resource nodes

Usage:\n  stchaind query register get-resource-count [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for get-resource-count\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query register get-resource-count\nnumber: \"2\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-get-meta-count","title":"-get-meta-count","text":"

Query the total number of bonded meta nodes

Usage:\n  stchaind query register get-meta-count [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for get-meta-count\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

Example:

stchaind query register get-meta-count\nnumber: \"4\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-register-params","title":"-register-params","text":"

Query values set as register parameters

Usage:\n  stchaind query register params [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for params\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query register params\nbond_denom: wei\nmax_entries: 16\nresource_node_reg_enabled: true\nunbonding_completion_time: 1209600s\nunbonding_threashold_time: 15552000s\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#sds-module","title":"SDS Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-upload-transaction","title":"-upload (transaction)","text":"

Create and sign a file upload tx

Usage:\n  stchaind tx sds upload [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --file-hash string      The hash of uploaded file\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for upload\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n      --reporter string       The reporter address of meta node that reported the file\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n      --uploader string       The owner address of resource node that uploaded the file\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx sds upload \\\n--file-hash=<file hash> \\\n--uploader=<file uploader, owner address of resource node> \\\n--reporter=<file reporter, meta node address> \\\n--from=<Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

 stchaind tx sds upload \\\n --file-hash=001A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F \\\n --uploader=st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw \\\n --reporter=stsds14c3em44vlh276cujnr2ez802uyjyeqrrsu9fuh \\\n --from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n --chain-id=mesos-1 \\\n --keyring-backend=test \\\n --gas=auto \\\n --gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-prepay","title":"-prepay","text":"

Create and sign a prepay tx

Usage:\n  stchaind tx sds prepay [from_address] [coins] [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for prepay\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx sds prepay <from_address, Name|address of private key> <coins> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend> \\\n--gas=auto\n

Transaction example:

 stchaind tx sds prepay st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh 10stos \\\n --chain-id=mesos-1 \\\n --keyring-backend=test \\\n --gas=auto \\\n --gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-upload-query","title":"-upload (query)","text":"

Query uploaded file info by hash

Usage:\n  stchaind query sds upload [file_hash] [flags]\n\nFlags:\n      --count-total       count total number of records in upload to query for\n      --height int        Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help              help for upload\n      --limit uint        pagination limit of upload to query for (default 100)\n      --offset uint       pagination offset of upload to query for\n  -o, --output string     Output format (text|json) (default \"text\")\n      --page uint         pagination page of upload to query for. This sets offset to a multiple of limit (default 1)\n      --page-key string   pagination page-key of upload to query for\n      --reverse           results are sorted in descending order\n

Example:

Usage:\nstchaind query sds upload <file hash>\n

Transaction example:

stchaind query sds upload 001A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-sds-params","title":"-sds-params","text":"

Query values set as sds parameters

Usage:\n  stchaind query sds params [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for params\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query sds params\nbond_denom: wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#pot-module","title":"Pot Module","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-foundation-deposit","title":"-foundation-deposit","text":"

Deposit to foundation account

Usage:\n  stchaind tx pot foundation-deposit [flags]\n\nFlags:\n  -a, --account-number uint   The account number of the signing account (offline mode only)\n      --amount string         Amount of coins to withdraw\n      --dry-run               ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string    Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string            gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only         Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                  help for foundation-deposit\n      --keyring-dir string    The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                Use a connected Ledger device\n      --note string           Note to add a description to the transaction (previously --memo)\n      --offline               Offline mode (does not allow any online functionality\n  -o, --output string         Output format (text|json) (default \"json\")\n  -s, --sequence uint         The sequence number of the signing account (offline mode only)\n      --sign-mode string      Choose sign mode (direct|amino-json), this is an advanced feature\n      --timeout-height uint   Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                   Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx pot foundation-deposit \\\n--amount=<amount> \\\n--from=<from_address, Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

stchaind tx pot foundation-deposit \\\n--amount=40000stos \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-withdraw","title":"-withdraw","text":"

withdraw POT reward

Usage:\n  stchaind tx pot withdraw [flags]\n\nFlags:\n  -a, --account-number uint      The account number of the signing account (offline mode only)\n      --amount string            Amount of coins to withdraw\n  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default \"sync\")\n      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fees string              Fees to pay along with transaction; eg: 10gwei\n      --from string              Name or address of private key with which to sign\n      --gas string               gas limit to set per-transaction; set to \"auto\" to calculate required gas automatically (default 200000) (default \"200000\")\n      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)\n      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10gwei)\n      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)\n  -h, --help                     help for withdraw\n      --indent                   Add indent to JSON response\n      --keyring-backend string   Select keyring's backend (os|file|test) (default \"os\")\n      --ledger                   Use a connected Ledger device\n      --memo string              Memo to send along with transaction\n      --node string              <host>:<port> to tendermint rpc interface for this chain (default \"tcp://localhost:26657\")\n  -s, --sequence uint            The sequence number of the signing account (offline mode only)\n      --target-address string    The target account where the money is deposited after withdraw\n      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)\n  -y, --yes                      Skip tx broadcasting prompt confirmation\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx pot withdraw \\\n--amount=<amount to withdraw> \\\n--target-address=<wallet address of reciever> \\\n--from=<from_address, Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

stchaind tx pot withdraw \\\n--amount=100gwei \\\n--target-address=st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh --chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-legacy-withdraw","title":"-legacy-withdraw","text":"

Temporarily used to withdraw POT reward recorded by legacy wallet address

Usage:\n  stchaind tx pot legacy-withdraw [flags]\n\nFlags:\n  -a, --account-number uint     The account number of the signing account (offline mode only)\n      --amount string           Amount of coins to withdraw\n      --dry-run                 ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it\n      --fee-account string      Fee account pays fees for the transaction instead of deducting from the signer\n      --gas string              gas limit to set per-transaction; set to \"auto\" to calculate sufficient gas automatically (default 200000)\n      --generate-only           Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)\n  -h, --help                    help for legacy-withdraw\n      --keyring-dir string      The client Keyring directory; if omitted, the default 'home' directory will be used\n      --ledger                  Use a connected Ledger device\n      --note string             Note to add a description to the transaction (previously --memo)\n      --offline                 Offline mode (does not allow any online functionality\n  -o, --output string           Output format (text|json) (default \"json\")\n  -s, --sequence uint           The sequence number of the signing account (offline mode only)\n      --sign-mode string        Choose sign mode (direct|amino-json), this is an advanced feature\n      --target-address string   The target wallet address to deposit into after withdrawing\n      --timeout-height uint     Set a block timeout height to prevent the tx from being committed past a certain height\n  -y, --yes                     Skip tx broadcasting prompt confirmation\n\n\n  In testing phase, --keyring-backend=\"test\"\n

Example:

Usage:\nstchaind tx pot legacy-withdraw \\\n--amount=<amount to withdraw> \\\n--target-address=<wallet address of reciever> \\\n--from=<from_address, Name|address of private key> \\\n--chain-id=<current chain-id> \\\n--keyring-backend=<keyring's backend>\n

Transaction example:

stchaind tx pot legacy-withdraw \\\n--amount=100gwei \\\n--target-address=st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx \\\n--from=st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh \\\n--chain-id=mesos-1 \\\n--keyring-backend=test \\\n--gas=auto \\\n--gas-prices=1000000000wei -y\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-report","title":"-report","text":"

Query volume report by epoch

Usage:\n  stchaind query pot report [flags]\n\nFlags:\n      --epoch string    the epoch when this PoT message reported.\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for report\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query pot report --epoch=1\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-pot-params","title":"-pot-params","text":"

Query values set as pot parameters

Usage:\n  stchaind query pot params [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for params\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query pot params \n\nbond_denom: wei\ncommunity_tax: \"0.020000000000000000\"\ninitial_total_supply:\n  amount: \"400000000000000000000000000\"\n  denom: wei\nmature_epoch: \"2016\"\nmining_reward_params:\n- block_chain_percentage_in_bp: \"2000\"\n  meta_node_percentage_in_bp: \"2000\"\n  mining_reward:\n    amount: \"80000000000000000000\"\n    denom: wei\n  resource_node_percentage_in_bp: \"6000\"\n  total_mined_valve_end:\n    amount: \"16819200000000000000000000\"\n    denom: wei\n  total_mined_valve_start:\n    amount: \"0\"\n    denom: wei\n- block_chain_percentage_in_bp: \"2000\"\n  meta_node_percentage_in_bp: \"1800\"\n  mining_reward:\n    amount: \"40000000000000000000\"\n    denom: wei\n  resource_node_percentage_in_bp: \"6200\"\n  total_mined_valve_end:\n    amount: \"25228800000000000000000000\"\n    denom: wei\n  total_mined_valve_start:\n    amount: \"16819200000000000000000000\"\n    denom: wei\n- block_chain_percentage_in_bp: \"2000\"\n  meta_node_percentage_in_bp: \"1600\"\n  mining_reward:\n    amount: \"20000000000000000000\"\n    denom: wei\n  resource_node_percentage_in_bp: \"6400\"\n  total_mined_valve_end:\n    amount: \"29433600000000000000000000\"\n    denom: wei\n  total_mined_valve_start:\n    amount: \"25228800000000000000000000\"\n    denom: wei\n- block_chain_percentage_in_bp: \"2000\"\n  meta_node_percentage_in_bp: \"1400\"\n  mining_reward:\n    amount: \"10000000000000000000\"\n    denom: wei\n  resource_node_percentage_in_bp: \"6600\"\n  total_mined_valve_end:\n    amount: \"31536000000000000000000000\"\n    denom: wei\n  total_mined_valve_start:\n    amount: \"29433600000000000000000000\"\n    denom: wei\n- block_chain_percentage_in_bp: \"2000\"\n  meta_node_percentage_in_bp: \"1200\"\n  mining_reward:\n    amount: \"5000000000000000000\"\n    denom: wei\n  resource_node_percentage_in_bp: \"6800\"\n  total_mined_valve_end:\n    amount: \"32587200000000000000000000\"\n    denom: wei\n  total_mined_valve_start:\n    amount: \"31536000000000000000000000\"\n    denom: wei\n- block_chain_percentage_in_bp: \"2000\"\n  meta_node_percentage_in_bp: \"1000\"\n  mining_reward:\n    amount: \"2500000000000000000\"\n    denom: wei\n  resource_node_percentage_in_bp: \"7000\"\n  total_mined_valve_end:\n    amount: \"40000000000000000000000000\"\n    denom: wei\n  total_mined_valve_start:\n    amount: \"32587200000000000000000000\"\n    denom: wei\nreward_denom: wei\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#tendermint","title":"Tendermint","text":"

Tendermint subcommands

Usage:\n  stchaind tendermint [command]\n\nAvailable Commands:\n  reset-state      Remove all the data and WAL\n  show-address     Shows this node's tendermint validator consensus address\n  show-node-id     Show this node's ID\n  show-validator   Show this node's tendermint validator info\n  unsafe-reset-all (unsafe) Remove all the data and WAL, reset this node's validator to genesis state\n  version          Print tendermint libraries' version\n\nFlags:\n  -h, --help   help for tendermint\n\nGlobal Flags:\n  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default \"sync\")\n      --chain-id string          Specify Chain ID for sending Tx (default \"testnet\")\n      --fees string              Fees to pay along with transaction; eg: 10wei\n      --from string              Name or address of private key with which to sign\n      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)\n      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10wei)\n      --home string              directory for config and data (default \"/home/hong/.stchaind\")\n      --keyring-backend string   Select keyring's backend (default \"os\")\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      --node string              <host>:<port> to tendermint rpc interface for this chain (default \"tcp://localhost:26657\")\n      --trace                    print out full stack trace on errors\n
"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-show-address","title":"-show-address","text":"

Shows this node's tendermint validator consensus address

Usage:\n  stchaind tendermint show-address [flags]\n\nFlags:\n  -h, --help   help for show-address\n

Example:

stchaind tendermint show-address\n  stvalcons1rzn3d8qmgf7ejsfn77eag5zwjfufmvmu7sn802\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-show-node-id","title":"-show-node-id","text":"

Show this node's ID

Usage:\n  stchaind tendermint show-node-id [flags]\n\nFlags:\n  -h, --help   help for show-node-id\n

Example:

stchaind tendermint show-node-id\n  d3875ac126c90fa293f0591ad99cd587b6b5c6cc\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-show-validator","title":"-show-validator","text":"

Show this node's tendermint validator info

Usage:\n  stchaind tendermint show-validator [flags]\n\nFlags:\n  -h, --help   help for show-validator\n

Example:

stchaind tendermint show-validator\n  {\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\"}\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-version","title":"-version","text":"

Print protocols' and libraries' version numbers against which this app has been compiled

Usage:\n  stchaind tendermint version [flags]\n\nFlags:\n  -h, --help   help for version\n

Example:

stchaind tendermint version\n    tendermint: 0.34.21\n    abci: 0.17.0\n    blockprotocol: 11\n    p2pprotocol: 8\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#others","title":"Others","text":""},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-init-nodes","title":"-init nodes","text":"

Initialize validator's and node's configuration files.

Usage:\n  stchaind init [moniker] [flags]\n\nFlags:\n  -h, --help        help for init\n  -o, --overwrite   overwrite the genesis.json file\n      --recover     provide seed phrase to recover existing key instead of creating\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-start-st-chain","title":"-start st-chain","text":"

Run the full node application with Tendermint in or out of process. By default, the application will run with Tendermint in process.

Pruning options can be provided via the '--pruning' flag or alternatively with '--pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' together.

For '--pruning' the options are as follows:

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'

Node halting configurations exist in the form of two flags: '--halt-height' and '--halt-time'. During the ABCI Commit phase, the node will check if the current block height is greater than or equal to the halt-height or if the current block time is greater than or equal to the halt-time. If so, the node will attempt to gracefully shutdown and the block will not be committed. In addition, the node will not be able to commit subsequent blocks.

For profiling and benchmarking purposes, CPU profiling can be enabled via the '--cpu-profile' flag which accepts a path for the resulting pprof file.

Usage:\n  stchaind start [flags]\n\nFlags:\n      --abci string                                     specify abci transport (socket | grpc) (default \"socket\")\n      --address string                                  Listen address (default \"tcp://0.0.0.0:26658\")\n      --api.enable                                      Defines if Cosmos-sdk REST server should be enabled\n      --api.enabled-unsafe-cors                         Defines if CORS should be enabled (unsafe - use it at your own risk)\n      --consensus.create_empty_blocks                   set this to false to only produce blocks when there are txs or when the AppHash changes (default true)\n      --consensus.create_empty_blocks_interval string   the possible interval between empty blocks (default \"0s\")\n      --consensus.double_sign_check_height int          how many blocks to look back to check existence of the node's consensus votes before joining consensus\n      --cpu-profile string                              Enable CPU profiling and write to the provided file\n      --db_backend string                               database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb (default \"goleveldb\")\n      --db_dir string                                   database directory (default \"data\")\n      --evm.max-tx-gas-wanted uint                      the gas wanted for each eth tx returned in ante handler in check tx mode (default 500000)\n      --evm.tracer string                               the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)\n      --fast_sync                                       fast blockchain syncing (default true)\n      --genesis_hash bytesHex                           optional SHA-256 hash of the genesis file\n      --grpc-web.address string                         The gRPC-Web server address to listen on (default \"0.0.0.0:9091\")\n      --grpc-web.enable                                 Define if the gRPC-Web server should be enabled. (Note gRPC must also be enabled.) (default true)\n      --grpc.address string                             the gRPC server address to listen on (default \"0.0.0.0:9090\")\n      --grpc.enable                                     Define if the gRPC server should be enabled (default true)\n      --halt-height uint                                Block height at which to gracefully halt the chain and shutdown the node\n      --halt-time uint                                  Minimum block time (in Unix seconds) at which to gracefully halt the chain and shutdown the node\n  -h, --help                                            help for start\n      --inter-block-cache                               Enable inter-block caching (default true)\n      --inv-check-period uint                           Assert registered invariants every N blocks\n      --json-rpc.address string                         the JSON-RPC server address to listen on (default \"0.0.0.0:8545\")\n      --json-rpc.api strings                            Defines a list of JSON-RPC namespaces that should be enabled (default [eth,net,web3])\n      --json-rpc.block-range-cap eth_getLogs            Sets the max block range allowed for eth_getLogs query (default 10000)\n      --json-rpc.enable                                 Define if the gRPC server should be enabled (default true)\n      --json-rpc.evm-timeout duration                   Sets a timeout used for eth_call (0=infinite) (default 5s)\n      --json-rpc.filter-cap int32                       Sets the global cap for total number of filters that can be created (default 200)\n      --json-rpc.gas-cap uint                           Sets a cap on gas that can be used in eth_call/estimateGas unit is gwei (0=infinite) (default 25000000)\n      --json-rpc.http-idle-timeout duration             Sets a idle timeout for json-rpc http server (0=infinite) (default 2m0s)\n      --json-rpc.http-timeout duration                  Sets a read/write timeout for json-rpc http server (0=infinite) (default 30s)\n      --json-rpc.logs-cap eth_getLogs                   Sets the max number of results can be returned from single eth_getLogs query (default 10000)\n      --json-rpc.txfee-cap float                        Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 gwei) (default 1)\n      --json-rpc.ws-address string                      the JSON-RPC WS server address to listen on (default \"0.0.0.0:8546\")\n      --min-retain-blocks uint                          Minimum block height offset during ABCI commit to prune Tendermint blocks\n      --minimum-gas-prices string                       Minimum gas prices to accept for transactions; Any fee in a tx must meet this minimum (e.g. 0.01stos)\n      --moniker string                                  node name (default \"ubuntu\")\n      --p2p.laddr string                                node listen address. (0.0.0.0:0 means any interface, any port) (default \"tcp://0.0.0.0:26656\")\n      --p2p.persistent_peers string                     comma-delimited ID@host:port persistent peers\n      --p2p.pex                                         enable/disable Peer-Exchange (default true)\n      --p2p.private_peer_ids string                     comma-delimited private peer IDs\n      --p2p.seed_mode                                   enable/disable seed mode\n      --p2p.seeds string                                comma-delimited ID@host:port seed nodes\n      --p2p.unconditional_peer_ids string               comma-delimited IDs of unconditional peers\n      --p2p.upnp                                        enable/disable UPNP port forwarding\n      --priv_validator_laddr string                     socket address to listen on for connections from external priv_validator process\n      --proxy_app string                                proxy app address, or one of: 'kvstore', 'persistent_kvstore', 'counter', 'e2e' or 'noop' for local testing. (default \"tcp://127.0.0.1:26658\")\n      --pruning string                                  Pruning strategy (default|nothing|everything|custom) (default \"default\")\n      --pruning-interval uint                           Height interval at which pruned heights are removed from disk (ignored if pruning is not 'custom')\n      --pruning-keep-every uint                         Offset heights to keep on disk after 'keep-every' (ignored if pruning is not 'custom')\n      --pruning-keep-recent uint                        Number of recent heights to keep on disk (ignored if pruning is not 'custom')\n      --rpc.grpc_laddr string                           GRPC listen address (BroadcastTx only). Port required\n      --rpc.laddr string                                RPC listen address. Port required (default \"tcp://127.0.0.1:26657\")\n      --rpc.pprof_laddr string                          pprof listen address (https://golang.org/pkg/net/http/pprof)\n      --rpc.unsafe                                      enabled unsafe rpc methods\n      --state-sync.snapshot-interval uint               State sync snapshot interval\n      --state-sync.snapshot-keep-recent uint32          State sync snapshot to keep (default 2)\n      --tls.certificate-path string                     the cert.pem file path for the server TLS configuration\n      --tls.key-path string                             the key.pem file path for the server TLS configuration\n      --trace-store string                              Enable KVStore tracing to an output file\n      --transport string                                Transport protocol: socket, grpc (default \"socket\")\n      --unsafe-skip-upgrades ints                       Skip a set of upgrade heights to continue the old binary\n      --with-tendermint                                 Run abci app embedded in-process with tendermint (default true)\n      --x-crisis-skip-assert-invariants                 Skip x/crisis invariants check on startup\n

Example:

stchaind start\n

Result:

stchaind start\n  11:40AM INF Unlocking keyring\n  11:40AM INF starting ABCI with Tendermint\n  11:40AM INF Starting multiAppConn service impl=multiAppConn module=proxy server=node\n  11:40AM INF Starting localClient service connection=query impl=localClient module=abci-client server=node\n  11:40AM INF Starting localClient service connection=snapshot impl=localClient module=abci-client server=node\n  11:40AM INF Starting localClient service connection=mempool impl=localClient module=abci-client server=node\n  11:40AM INF Starting localClient service connection=consensus impl=localClient module=abci-client server=node\n  11:40AM INF Starting EventBus service impl=EventBus module=events server=node\n  11:40AM INF Starting PubSub service impl=PubSub module=pubsub server=node\n  11:40AM INF Starting IndexerService service impl=IndexerService module=txindex server=node\n  11:40AM INF ABCI Handshake App Info hash=\"r\ufffdp=W\\\"\ufffd\ufffd\\x05v\\x17K\ufffd\\a \ufffdA?\ufffd/\ufffd\ufffd\ufffd\ufffd\ufffdk\u012d\\x17W\\x14}\" height=2551 module=consensus protocol-version=0 server=node software-version=v0.8.0\n  11:40AM INF ABCI Replay Blocks appHeight=2551 module=consensus server=node stateHeight=2551 storeHeight=2551\n  11:40AM INF Completed ABCI Handshake - Tendermint and App are synced appHash=\"r\ufffdp=W\\\"\ufffd\ufffd\\x05v\\x17K\ufffd\\a \ufffdA?\ufffd/\ufffd\ufffd\ufffd\ufffd\ufffdk\u012d\\x17W\\x14}\" appHeight=2551 module=consensus server=node\n  11:40AM INF Version info block=11 p2p=8 server=node tendermint_version=0.34.19\n  11:40AM INF This node is a validator addr=EA5F7899F5CC81675EA98BF329BB93CAE294B01C module=consensus pubKey=eYVLsz4XOB5HiadCpXxeUP48FTYrmFUGIe+hYv92E7I= server=node\n  11:40AM INF P2P Node ID ID=f8e9d6c5874feb1e9441380eb8e189ba88238d80 file=node/stchaind/config/node_key.json module=p2p server=node\n  11:40AM INF Adding persistent peers addrs=[] module=p2p server=node\n  11:40AM INF Adding unconditional peer ids ids=[] module=p2p server=node\n  11:40AM INF Add our address to book addr={\"id\":\"f8e9d6c5874feb1e9441380eb8e189ba88238d80\",\"ip\":\"0.0.0.0\",\"port\":26656} book=node/stchaind/config/addrbook.json module=p2p server=node\n  11:40AM INF Starting Node service impl=Node server=node\n  11:40AM INF Starting pprof server laddr=localhost:6060 server=node\n  11:40AM INF Starting RPC HTTP server on 127.0.0.1:26657 module=rpc-server server=node\n  11:40AM INF Starting P2P Switch service impl=\"P2P Switch\" module=p2p server=node\n  11:40AM INF Starting Consensus service impl=ConsensusReactor module=consensus server=node\n  11:40AM INF Reactor  module=consensus server=node waitSync=false\n  11:40AM INF Starting State service impl=ConsensusState module=consensus server=node\n  11:40AM INF Starting baseWAL service impl=baseWAL module=consensus server=node wal=node/stchaind/data/cs.wal/wal\n  11:40AM INF Starting Group service impl=Group module=consensus server=node wal=node/stchaind/data/cs.wal/wal\n  11:40AM INF Starting TimeoutTicker service impl=TimeoutTicker module=consensus server=node\n  11:40AM INF Searching for height height=2552 max=0 min=0 module=consensus server=node wal=node/stchaind/data/cs.wal/wal\n  11:40AM INF Searching for height height=2551 max=0 min=0 module=consensus server=node wal=node/stchaind/data/cs.wal/wal\n  11:40AM INF Found height=2551 index=0 module=consensus server=node wal=node/stchaind/data/cs.wal/wal\n  11:40AM INF Catchup by replaying consensus messages height=2552 module=consensus server=node\n  11:40AM INF Replay: New Step height=2552 module=consensus round=0 server=node step=RoundStepNewHeight\n  11:40AM INF Replay: Done module=consensus server=node\n  11:40AM INF Starting Evidence service impl=Evidence module=evidence server=node\n  11:40AM INF Starting StateSync service impl=StateSync module=statesync server=node\n  11:40AM INF Starting PEX service impl=PEX module=pex server=node\n  11:40AM INF Starting AddrBook service book=node/stchaind/config/addrbook.json impl=AddrBook module=p2p server=node\n  11:40AM INF Starting Mempool service impl=Mempool module=mempool server=node\n  11:40AM INF Starting BlockchainReactor service impl=BlockchainReactor module=blockchain server=node\n  11:40AM INF Saving AddrBook to file book=node/stchaind/config/addrbook.json module=p2p server=node size=0\n  11:40AM INF Ensure peers module=pex numDialing=0 numInPeers=0 numOutPeers=0 numToDial=10 server=node\n  11:40AM INF No addresses to dial. Falling back to seeds module=pex server=node\n  11:40AM INF starting API server... server=api\n  11:40AM INF Starting RPC HTTP server on [::]:1317 server=api\n\n...\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-config","title":"-config","text":"

Create or query an application CLI configuration file.

Usage:\n  stchaind config <key> <value> [flags]\n\nFlags:\n      --get    print configuration value or its default if unset\n  -h, --help   help for config\n

Create Configuration Example:

stchaind config keyring-backend local-test\n  configuration saved to $HOME/.stchaind/config/client.toml\n

Query Configuration Example:

stchaind config keyring-backend\n  test\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-keys","title":"-keys","text":"

Keyring management commands. These keys may be in any format supported by the Tendermint crypto library and can be used by light-clients, full nodes, or any other application that needs to sign with a private key.

The keyring supports the following backends:\n\n    os          Uses the operating system's default credentials store.\n    file        Uses encrypted file-based keystore within the app's configuration directory.\n                This keyring will request a password each time it is accessed, which may occur\n                multiple times in a single command resulting in repeated password prompts.\n    kwallet     Uses KDE Wallet Manager as a credentials management application.\n    pass        Uses the pass command line utility to store and retrieve keys.\n    test        Stores keys insecurely to disk. It does not prompt for a password to be unlocked\n                and it should be use only for testing purposes.\n\nkwallet and pass backends depend on external tools. Refer to their respective documentation for more\ninformation:\n    KWallet     https://github.com/KDE/kwallet\n    pass        https://www.passwordstore.org/\n\nThe pass backend requires GnuPG: https://gnupg.org/\n\nUsage:\n  stchaind keys [command]\n\nAvailable Commands:\n\n\n  add                   Add an encrypted private key (either newly generated or recovered), encrypt it, and save to <name> file\n  delete                Delete the given keys\n  export                Export private keys\n  import                Import private keys into the local keybase\n  list                  List all keys\n  migrate               Migrate keys from the legacy (db-based) Keybase\n  mnemonic              Compute the bip39 mnemonic for some input entropy\n  parse                 Parse address from hex to bech32 and vice versa\n  show                  Retrieve key information by name or address\n  unsafe-export-eth-key **UNSAFE** Export an Ethereum private key\n  unsafe-import-eth-key **UNSAFE** Import Ethereum private keys into the local keybase\n\nFlags:\n  -h, --help                 help for keys\n      --keyring-dir string   The client Keyring directory; if omitted, the default 'home' directory will be used\n      --output string        Output format (text|json) (default \"text\")\n

Example:

stchaind keys list --keyring-backend=test\n

Result:

- name: user0\n  type: local\n  address: st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw\n  pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A/wF15Wd3ogCXstE7S4Zf3DA4KXb0W7exQhP004PLTi3\"}'\n  mnemonic: \"\"\n- name: user1\n  type: local\n  address: st1dz20dmhjkuc2tur3amgl8t45w807a640leh8p0\n  pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"AgnhB5EkHL8+jD0/zRDR11nIpfOirTRrjgCX6uibhmDW\"}'\n  mnemonic: \"\"\n- name: user10\n  type: local\n  address: st1lkcrz3ktt2p7ppu9arglpqcn94pcdd9a9pmatf\n  pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A2sZ2Z9BU9oDELC06Gj8Lfc5UycxTaPux3sEIq8sIzSW\"}'\n  mnemonic: \"\"\n- name: user2\n  type: local\n  address: st16czjk2ym0prgvy4gl970t84vrp96s5kayfqmf2\n  pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"AwfcJTOVWdx6ai61cy8VGJ1SdWHzwm2CCmr/+PwSpFeR\"}'\n  mnemonic: \"\"\n- name: user3\n  type: local\n  address: st17patveqxcq42rguc7nayr2g3jtawpzvhfmmumt\n  pubkey: '{\"@type\":\"/stratos.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"AtFxbuB4s+2SYzImGPIBwe0H0mKCXbIPu1T63OvbgE/3\"}'\n  mnemonic: \"\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-status","title":"-status","text":"

Query remote node for status.

Usage:\n  stchaind status [flags]\n\nFlags:\n  -h, --help   help for status\n

Example:

stchaind status\n

Result:

{\n    \"NodeInfo\": {\n        \"protocol_version\": {\n            \"p2p\": \"8\",\n            \"block\": \"11\",\n            \"app\": \"0\"\n        },\n        \"id\": \"16a0758d175cbf5c08d41dffa73eb5c0190869ed\",\n        \"listen_addr\": \"tcp://0.0.0.0:26656\",\n        \"network\": \"test-chain\",\n        \"version\": \"0.34.21\",\n        \"channels\": \"40202122233038606100\",\n        \"moniker\": \"node\",\n        \"other\": {\n            \"tx_index\": \"on\",\n            \"rpc_address\": \"tcp://127.0.0.1:26657\"\n        }\n    },\n    \"SyncInfo\": {\n        \"latest_block_hash\": \"697A2DB243E5191C6D85285A2ADD4924526924969C6C70FE71827C9FE41D4373\",\n        \"latest_app_hash\": \"E978F87BB23D351B853F5F0CF9FBBBA4464FF5D7CE3746BF3E2357F28CBCE041\",\n        \"latest_block_height\": \"497\",\n        \"latest_block_time\": \"2023-01-11T01:10:37.562405326Z\",\n        \"earliest_block_hash\": \"139676534FECFA507D56A06B03BD528E70ACA6D4DB6560219707011966613DE4\",\n        \"earliest_app_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n        \"earliest_block_height\": \"1\",\n        \"earliest_block_time\": \"2023-01-09T17:08:58.4890503Z\",\n        \"catching_up\": false\n    },\n    \"ValidatorInfo\": {\n        \"Address\": \"18A7169C1B427D994133F7B3D4504E92789DB37C\",\n        \"PubKey\": {\n            \"type\": \"tendermint/PubKeyEd25519\",\n            \"value\": \"69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\"\n        },\n        \"VotingPower\": \"500000\"\n    }\n}\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-version_1","title":"-version","text":"

Print the application binary version information

Usage:\n  stchaind version [flags]\n\nFlags:\n  -h, --help            help for version\n      --long            Print long version information\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind version \n  v0.9.0\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-account","title":"-account","text":"

Query for account by address.

Usage:\n  stchaind query account [address] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for account\n  -o, --output string   Output format (text|json) (default \"text\")\n

Example:

stchaind query account st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw\n

Result:

'@type': /stratos.types.v1.EthAccount\nbase_account:\n  account_number: \"0\"\n  address: st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw\n  pub_key:\n    '@type': /stratos.crypto.v1.ethsecp256k1.PubKey\n    key: A/wF15Wd3ogCXstE7S4Zf3DA4KXb0W7exQhP004PLTi3\n  sequence: \"4\"\ncode_hash: 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-tendermint-validator-set","title":"-tendermint-validator-set","text":"

Get the full tendermint validator set at given height

Usage:\n  stchaind query tendermint-validator-set [height] [flags]\n\nFlags:\n  -h, --help        help for tendermint-validator-set\n      --limit int   Query number of results returned per page (default 100)\n      --page int    Query a specific page of paginated results (default 1)\n

Example:

stchaind query tendermint-validator-set 1\n

Result:

block_height: \"1\"\ntotal: \"1\"\nvalidators:\n- address: stvalcons1rzn3d8qmgf7ejsfn77eag5zwjfufmvmu7sn802\n  proposer_priority: \"0\"\n  pub_key:\n    type: tendermint/PubKeyEd25519\n    value: 69gothWTE9FJBZ5gBjjSNhg8y/5SsI1hBaD81Dum7lo=\n  voting_power: \"500000\"\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-block","title":"-block","text":"

Get verified data for a block at given height.

Usage:\n  stchaind query block [height] [flags]\n\nFlags:\n  -h, --help   help for block\n

Example:

stchaind query block 150\n

Result:

{\n    \"block_id\": {\n        \"hash\": \"74E410DF477CB2B54265160FE75B48E096BCF60A29F47B825EB017FAE1BB0263\",\n        \"parts\": {\n            \"total\": 1,\n            \"hash\": \"9870B5AAC0D6207850D7AC4D3072D5AC17C6AF120D50EB667E054D5613B12C6D\"\n        }\n    },\n    \"block\": {\n        \"header\": {\n            \"version\": {\n                \"block\": \"11\"\n            },\n            \"chain_id\": \"test-chain\",\n            \"height\": \"150\",\n            \"time\": \"2023-01-10T22:19:55.918496162Z\",\n            \"last_block_id\": {\n                \"hash\": \"56676AC4975414BD2BF86C29CBCC9124A97AF84E1654AC41862B520595E0E6A7\",\n                \"parts\": {\n                    \"total\": 1,\n                    \"hash\": \"B919897435939A560885651505D570FE93A77EA695F0E6A24F294E507F9F1BC9\"\n                }\n            },\n            \"last_commit_hash\": \"3435730FE67F2F8D2092DC384C42FBD4026DF749EE49DEEBBD4042F67B96911B\",\n            \"data_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n            \"validators_hash\": \"5234BD91A3A751E055C35876578DE4A466311A80D540B59885AF68EF6D4D56DE\",\n            \"next_validators_hash\": \"5234BD91A3A751E055C35876578DE4A466311A80D540B59885AF68EF6D4D56DE\",\n            \"consensus_hash\": \"048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F\",\n            \"app_hash\": \"724DAFFA7A2B129A8E956D531DF4F24616E76D03976ED899F4DFBBE1FBF53B39\",\n            \"last_results_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n            \"evidence_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n            \"proposer_address\": \"18A7169C1B427D994133F7B3D4504E92789DB37C\"\n        },\n        \"data\": {\n            \"txs\": null\n        },\n        \"evidence\": {\n            \"evidence\": null\n        },\n        \"last_commit\": {\n            \"height\": \"149\",\n            \"round\": 0,\n            \"block_id\": {\n                \"hash\": \"56676AC4975414BD2BF86C29CBCC9124A97AF84E1654AC41862B520595E0E6A7\",\n                \"parts\": {\n                    \"total\": 1,\n                    \"hash\": \"B919897435939A560885651505D570FE93A77EA695F0E6A24F294E507F9F1BC9\"\n                }\n            },\n            \"signatures\": [\n                {\n                    \"block_id_flag\": 2,\n                    \"validator_address\": \"18A7169C1B427D994133F7B3D4504E92789DB37C\",\n                    \"timestamp\": \"2023-01-10T22:19:55.918496162Z\",\n                    \"signature\": \"otYHnEyBJBM09TrcpX9CqwYGmgiJMErteqA5jUPFeplqGmIvZY7gHIzFfZh8RQKkN1umR1C0IyQypRvDQ2zJAw==\"\n                }\n            ]\n        }\n    }\n}\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-txs","title":"-txs","text":"

Search for transactions that match the exact given events where results are paginated. Each event takes the form of '{eventType}.{eventAttribute}={value}'. Please refer to each module's documentation for the full set of events to query for. Each module documents its respective events under 'xx_events.md'.

Usage:\n  stchaind query txs [flags]\n\nFlags:\n      --events string   list of transaction events in the form of {eventType}.{eventAttribute}={value}\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for txs\n      --limit int       Query number of transactions results per page returned (default 30)\n  -o, --output string   Output format (text|json) (default \"text\")\n      --page int        Query a specific page of paginated results (default 1)\n\nExample:\nstchaind query txs --events 'message.sender=cosmos1...&message.action=withdraw_delegator_reward' --page 1 --limit 30\n

Example:

stchaind query txs \\\n--events 'message.sender=st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k' \\\n--chain-id=mesos-1 \\\n--limit=20\n

Result:

  {\n    \"total_count\": \"2\",\n    \"count\": \"2\",\n    \"page_number\": \"1\",\n    \"page_total\": \"1\",\n    \"limit\": \"20\",\n    \"txs\": [\n        {\n            \"height\": \"3681\",\n            \"txhash\": \"EA0AB730219917533E73B1509EC38AE26614B2A8C4C4EA4E90026262127E8672\",\n            \"raw_log\": \"[{\\\"msg_index\\\":0,\\\"log\\\":\\\"\\\",\\\"events\\\":[{\\\"type\\\":\\\"message\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"action\\\",\\\"value\\\":\\\"vote\\\"},{\\\"key\\\":\\\"module\\\",\\\"value\\\":\\\"governance\\\"},{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\\\"}]},{\\\"type\\\":\\\"proposal_vote\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"option\\\",\\\"value\\\":\\\"Yes\\\"},{\\\"key\\\":\\\"proposal_id\\\",\\\"value\\\":\\\"7\\\"}]}]}]\",\n            \"logs\": [\n                {\n                    \"msg_index\": 0,\n                    \"log\": \"\",\n                    \"events\": [\n                        {\n                            \"type\": \"message\",\n                            \"attributes\": [\n                                {\n                                    \"key\": \"action\",\n                                    \"value\": \"vote\"\n                                },\n                                {\n                                    \"key\": \"module\",\n                                    \"value\": \"governance\"\n                                },\n                                {\n                                    \"key\": \"sender\",\n                                    \"value\": \"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"proposal_vote\",\n                            \"attributes\": [\n                                {\n                                    \"key\": \"option\",\n                                    \"value\": \"Yes\"\n                                },\n                                {\n                                    \"key\": \"proposal_id\",\n                                    \"value\": \"7\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"gas_wanted\": \"200000\",\n            \"gas_used\": \"38472\",\n            \"tx\": {\n                \"type\": \"cosmos-sdk/StdTx\",\n                \"value\": {\n                    \"msg\": [\n                        {\n                            \"type\": \"cosmos-sdk/MsgVote\",\n                            \"value\": {\n                                \"proposal_id\": \"7\",\n                                \"voter\": \"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\",\n                                \"option\": \"Yes\"\n                            }\n                        }\n                    ],\n                    \"fee\": {\n                        \"amount\": [],\n                        \"gas\": \"200000\"\n                    },\n                    \"signatures\": [\n                        {\n                            \"pub_key\": {\n                                \"type\": \"tendermint/PubKeySecp256k1\",\n                                \"value\": \"A8h5ZfH926q3EMdHeOdT2Z5W1KDjOc3LT33quKK8uCdZ\"\n                            },\n                            \"signature\": \"yE56xpZ4OI3+HxQr5bklYHuAOspKlwVC7hiSKnja63khIlU+TTnEhgoRvNgYub58HVbOBtslHU7QncNKSWEEbg==\"\n                        }\n                    ],\n                    \"memo\": \"\"\n                }\n            },\n            \"timestamp\": \"2021-07-23T14:41:18Z\"\n        },\n        {\n            \"height\": \"4400\",\n            \"txhash\": \"D21722FE6C3DE53268EEAF1A9C433DACF635B2715F6B5DCFBD5EED7B28705BE8\",\n            \"raw_log\": \"[{\\\"msg_index\\\":0,\\\"log\\\":\\\"\\\",\\\"events\\\":[{\\\"type\\\":\\\"message\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"action\\\",\\\"value\\\":\\\"vote\\\"},{\\\"key\\\":\\\"module\\\",\\\"value\\\":\\\"governance\\\"},{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\\\"}]},{\\\"type\\\":\\\"proposal_vote\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"option\\\",\\\"value\\\":\\\"Yes\\\"},{\\\"key\\\":\\\"proposal_id\\\",\\\"value\\\":\\\"9\\\"}]}]}]\",\n            \"logs\": [\n                {\n                    \"msg_index\": 0,\n                    \"log\": \"\",\n                    \"events\": [\n                        {\n                            \"type\": \"message\",\n                            \"attributes\": [\n                                {\n                                    \"key\": \"action\",\n                                    \"value\": \"vote\"\n                                },\n                                {\n                                    \"key\": \"module\",\n                                    \"value\": \"governance\"\n                                },\n                                {\n                                    \"key\": \"sender\",\n                                    \"value\": \"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"proposal_vote\",\n                            \"attributes\": [\n                                {\n                                    \"key\": \"option\",\n                                    \"value\": \"Yes\"\n                                },\n                                {\n                                    \"key\": \"proposal_id\",\n                                    \"value\": \"9\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"gas_wanted\": \"200000\",\n            \"gas_used\": \"38508\",\n            \"tx\": {\n                \"type\": \"cosmos-sdk/StdTx\",\n                \"value\": {\n                    \"msg\": [\n                        {\n                            \"type\": \"cosmos-sdk/MsgVote\",\n                            \"value\": {\n                                \"proposal_id\": \"9\",\n                                \"voter\": \"st1gtw399h9vfnekqsz3dg4n6mj0qgdpnh3c2n66k\",\n                                \"option\": \"Yes\"\n                            }\n                        }\n                    ],\n                    \"fee\": {\n                        \"amount\": [],\n                        \"gas\": \"200000\"\n                    },\n                    \"signatures\": [\n                        {\n                            \"pub_key\": {\n                                \"type\": \"tendermint/PubKeySecp256k1\",\n                                \"value\": \"A8h5ZfH926q3EMdHeOdT2Z5W1KDjOc3LT33quKK8uCdZ\"\n                            },\n                            \"signature\": \"+w/Qhm6JdyQLXsquiKe0WCqCNjqois2Zhc76h0AphDhQZTKlpD9qlVuA/BX7gmVrmiUdqG/G4YExu8XkQSvnSg==\"\n                        }\n                    ],\n                    \"memo\": \"\"\n                }\n            },\n            \"timestamp\": \"2021-07-25T00:36:47Z\"\n        }\n    ]\n}\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-tx","title":"-tx","text":"

Query for a transaction by hash in a committed block.

Example:\nstchaind query tx <hash>\nstchaind query tx --type=acc_seq <addr>/<sequence>\nstchaind query tx --type=signature <sig1_base64>,<sig2_base64...>\n\nUsage:\n  stchaind query tx --type=[hash|acc_seq|signature] [hash|acc_seq|signature] [flags]\n\nFlags:\n      --height int      Use a specific height to query state at (this can error if the node is pruning state)\n  -h, --help            help for tx\n  -o, --output string   Output format (text|json) (default \"text\")\n      --type string     The type to be used when querying tx, can be one of \"hash\", \"acc_seq\", \"signature\" (default \"hash\")\n

Example:

stchaind query tx AB0EF3761603145EDC1B4121C91B51001249186E1362E7148C82E7DB12F7BDF0\n

Result:

code: 0\ncodespace: \"\"\ndata: 0A1E0A1C2F636F736D6F732E62616E6B2E763162657461312E4D736753656E64\nevents:\n- attributes:\n  - index: true\n    key: c3BlbmRlcg==\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  - index: true\n    key: YW1vdW50\n    value: MjAwMDAwMDAwMDAwMDAwd2Vp\n  type: coin_spent\n- attributes:\n  - index: true\n    key: cmVjZWl2ZXI=\n    value: c3QxN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWx2NWhqMnE=\n  - index: true\n    key: YW1vdW50\n    value: MjAwMDAwMDAwMDAwMDAwd2Vp\n  type: coin_received\n- attributes:\n  - index: true\n    key: cmVjaXBpZW50\n    value: c3QxN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWx2NWhqMnE=\n  - index: true\n    key: c2VuZGVy\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  - index: true\n    key: YW1vdW50\n    value: MjAwMDAwMDAwMDAwMDAwd2Vp\n  type: transfer\n- attributes:\n  - index: true\n    key: c2VuZGVy\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  type: message\n- attributes:\n  - index: true\n    key: ZmVl\n    value: MjAwMDAwMDAwMDAwMDAwd2Vp\n  - index: true\n    key: ZmVlX3BheWVy\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  type: tx\n- attributes:\n  - index: true\n    key: YWNjX3NlcQ==\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamgvMw==\n  type: tx\n- attributes:\n  - index: true\n    key: c2lnbmF0dXJl\n    value: N0ZtZ0Irc1RuUDVLazRxMTIxWXlWZEpKa2RFcTNHaW95ZHU4ZlRQK3B4b01DL1RsNzd1SmxDUkJhblNQN2p4MXhFandUeHQzem5HTDlLTlFMUkFBMlFBPQ==\n  type: tx\n- attributes:\n  - index: true\n    key: YWN0aW9u\n    value: L2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZA==\n  type: message\n- attributes:\n  - index: true\n    key: c3BlbmRlcg==\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  - index: true\n    key: YW1vdW50\n    value: MTAwMDAwMDAwMHdlaQ==\n  type: coin_spent\n- attributes:\n  - index: true\n    key: cmVjZWl2ZXI=\n    value: c3Qxc3F6c2s4bXBsdjUyNDhneDZkZGR6enh3ZXF2ZXc4cnRzdDk2Zng=\n  - index: true\n    key: YW1vdW50\n    value: MTAwMDAwMDAwMHdlaQ==\n  type: coin_received\n- attributes:\n  - index: true\n    key: cmVjaXBpZW50\n    value: c3Qxc3F6c2s4bXBsdjUyNDhneDZkZGR6enh3ZXF2ZXc4cnRzdDk2Zng=\n  - index: true\n    key: c2VuZGVy\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  - index: true\n    key: YW1vdW50\n    value: MTAwMDAwMDAwMHdlaQ==\n  type: transfer\n- attributes:\n  - index: true\n    key: c2VuZGVy\n    value: c3QxcHZ5anpsaHdycGdrbHUwMDQ0YXQ0dDZxaDdtMjNrM2tyMmdzamg=\n  type: message\n- attributes:\n  - index: true\n    key: bW9kdWxl\n    value: YmFuaw==\n  type: message\ngas_used: \"88709\"\ngas_wanted: \"200000\"\nheight: \"611\"\ninfo: \"\"\nlogs:\n- events:\n  - attributes:\n    - key: receiver\n      value: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\n    - key: amount\n      value: 1000000000wei\n    type: coin_received\n  - attributes:\n    - key: spender\n      value: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n    - key: amount\n      value: 1000000000wei\n    type: coin_spent\n  - attributes:\n    - key: action\n      value: /cosmos.bank.v1beta1.MsgSend\n    - key: sender\n      value: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n    - key: module\n      value: bank\n    type: message\n  - attributes:\n    - key: recipient\n      value: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\n    - key: sender\n      value: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n    - key: amount\n      value: 1000000000wei\n    type: transfer\n  log: \"\"\n  msg_index: 0\nraw_log: '[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\"},{\"key\":\"amount\",\"value\":\"1000000000wei\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\"},{\"key\":\"amount\",\"value\":\"1000000000wei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/cosmos.bank.v1beta1.MsgSend\"},{\"key\":\"sender\",\"value\":\"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\"},{\"key\":\"sender\",\"value\":\"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\"},{\"key\":\"amount\",\"value\":\"1000000000wei\"}]}]}]'\ntimestamp: \"2023-01-11T01:20:11Z\"\ntx:\n  '@type': /cosmos.tx.v1beta1.Tx\n  auth_info:\n    fee:\n      amount:\n      - amount: \"200000000000000\"\n        denom: wei\n      gas_limit: \"200000\"\n      granter: \"\"\n      payer: \"\"\n    signer_infos:\n    - mode_info:\n        single:\n          mode: SIGN_MODE_DIRECT\n      public_key:\n        '@type': /stratos.crypto.v1.ethsecp256k1.PubKey\n        key: Agkwb1xacHBqeqGBIqRacXgf0qKTnEBPCEtH2vTE01Ke\n      sequence: \"3\"\n  body:\n    extension_options: []\n    memo: \"\"\n    messages:\n    - '@type': /cosmos.bank.v1beta1.MsgSend\n      amount:\n      - amount: \"1000000000\"\n        denom: wei\n      from_address: st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n      to_address: st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\n    non_critical_extension_options: []\n    timeout_height: \"0\"\n  signatures:\n  - 7FmgB+sTnP5Kk4q121YyVdJJkdEq3Gioydu8fTP+pxoMC/Tl77uJlCRBanSP7jx1xEjwTxt3znGL9KNQLRAA2QA=\ntxhash: AB0EF3761603145EDC1B4121C91B51001249186E1362E7148C82E7DB12F7BDF0\n

"},{"location":"docs-stratos-chain/stchaind-commands-part-2/#-export","title":"-export","text":"

Export state to JSON.

Usage:\n  stchaind export [flags]\n\nFlags:\n      --for-zero-height              Export state to start at height zero (perform preproccessing)\n      --height int                   Export state from a particular height (-1 means latest height) (default -1)\n  -h, --help                         help for export\n      --jail-allowed-addrs strings   Comma-separated list of operator addresses of jailed validators to unjail\n

Example:

stchaind export > dump.json\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/","title":"Stratos Chain stchaind gRPC queries","text":"

Cosmos SDK gRPC definitions have been documented here

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#register-module","title":"Register Module","text":""},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#grpc-gateway","title":"gRPC Gateway","text":"Method Name Request Type Response Type Description ResourceNode QueryResourceNodeRequest fields:{\"network_addr\":string} QueryResourceNodeResponse fields:{\"node\":ResourceNode} Get info of a registered resource node MetaNode QueryMetaNodeRequest fields:{\"network_addr\":string} QueryMetaNodeResponse fields:{\"node\":MetaNode} Get info of a registered meta node Params QueryParamsRequest fields:{} QueryParamsResponse fields:{\"params\":Params} Get params of Register Module DepositByNode QueryDepositByNodeRequest fields:{\"network_addr\":string, query_type:uint32} QueryDepositByNodeResponse fields:{\"deposit_info\":DepositInfo } Get deposit info of a specific node DepositByOwner QueryDepositByOwnerRequest fields:{\"owner_addr\":string} QueryDepositByOwnerResponse fields:{\"deposit_infos\":[]DepositInfo, \"pagination\": cosmos.base.query.v1beta1.PageResponse } Get all deposit info of a specific owner DepositTotal QueryDepositTotalRequest fields:{} QueryDepositTotalResponse fields:{\"resource_nodes_total_deposit\":cosmos.base.v1beta1.Coin, \"meta_nodes_total_deposit\":cosmos.base.v1beta1.Coin, \"total_bonded_deposit\":cosmos.base.v1beta1.Coin, \"total_unbonded_deposit\":cosmos.base.v1beta1.Coin, \"total_unbonding_deposit\":cosmos.base.v1beta1.Coin} Query total deposit state of all registered resource nodes and meta nodes BondedResourceNodeCount QueryBondedResourceNodeCountRequest fields:{} QueryBondedResourceNodeCountResponse fields:{\"number\": uint64} Get params of Register Module BondedMetaNodeCount QueryBondedMetaNodeCountRequest fields:{} QueryBondedMetaNodeCountResponse fields:{\"number\": uint64} Get params of Register Module RemainingOzoneLimit QueryRemainingOzoneLimitRequest fields:{} QueryRemainingOzoneLimitResponse fields:{\"ozone_limit\": string}

ResourceNode:

Field Type Label network_address string pubkey google.protobuf.Any suspend bool status cosmos.staking.v1beta1.BondStatus tokens string owner_address string description Description creation_time google.protobuf.Timestamp node_type uint32 effective_tokens string beneficiary_address string

MetaNode:

Field Type Label network_address string pubkey google.protobuf.Any suspend bool status cosmos.staking.v1beta1.BondStatus tokens string owner_address string description Description creation_time google.protobuf.Timestamp beneficiary_address string

Description:

Field Type Label moniker string identity string website string security_contact string details string

Params:

Field Type Label bond_denom string unbonding_threashold_time google.protobuf.Duration unbonding_completion_time google.protobuf.Duration max_entries uint32 resource_node_reg_enabled bool resource_node_min_deposit cosmos.base.v1beta1.Coin voting_period google.protobuf.Duration

DepositInfo:

Field Type Label network_address string pubkey google.protobuf.Any suspend bool status cosmos.staking.v1beta1.BondStatus tokens string owner_address string description Description creation_time google.protobuf.Timestamp node_type uint32 bonded_deposit cosmos.base.v1beta1.Coin un_bonding_deposit cosmos.base.v1beta1.Coin un_bonded_deposit cosmos.base.v1beta1.Coin

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-list","title":"- List","text":"

List all available grpc queries in Register Module

Request:

grpcurl -plaintext 127.0.0.1:9090 list stratos.register.v1.Query\n
Response:

stratos.register.v1.Query.ResourceNode\nstratos.register.v1.Query.MetaNode\nstratos.register.v1.Query.Params\nstratos.register.v1.Query.DepositByNode\nstratos.register.v1.Query.DepositByOwner\nstratos.register.v1.Query.DepositTotal\nstratos.register.v1.Query.BondedResourceNodeCount\nstratos.register.v1.Query.BondedMetaNodeCount\nstratos.register.v1.Query.RemainingOzoneLimit\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-resourcenode","title":"- ResourceNode","text":"

Get info of a registered resource node

Request:

grpcurl -plaintext -d '{\"network_addr\":\"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\"}' 127.0.0.1:9090 stratos.register.v1.Query.ResourceNode\n

Response:

{\n  \"node\": {\n    \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n    \"pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n    },\n    \"suspend\": true,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"1000000000000000000\",\n    \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"description\": {\n      \"moniker\": \"resource-node0\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"2024-03-08T19:18:51.591341919Z\",\n    \"node_type\": 4,\n    \"effective_tokens\": \"0\",\n    \"beneficiary_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-metanode","title":"- MetaNode","text":"

Get info of a registered meta node

Request:

grpcurl -plaintext -d '{\"network_addr\":\"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\"}' 127.0.0.1:9090 stratos.register.v1.Query.MetaNode\n

Response:

{\n  \"node\": {\n    \"network_address\": \"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\",\n    \"pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ=\"\n    },\n    \"suspend\": false,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"100000000000000000000\",\n    \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"description\": {\n      \"moniker\": \"snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"0001-01-01T00:00:00Z\",\n    \"beneficiary_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-params","title":"- Params","text":"

Get params of Register Module

Request:

grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.Params\n

Response:

{\n  \"params\": {\n    \"bond_denom\": \"wei\",\n    \"unbonding_threashold_time\": \"15552000s\",\n    \"unbonding_completion_time\": \"1209600s\",\n    \"max_entries\": 16,\n    \"resource_node_reg_enabled\": true,\n    \"resource_node_min_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"1000000000000000000\"\n    },\n    \"voting_period\": \"604800s\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-depositbynode","title":"- DepositByNode","text":"

Get deposit info of a specific node

Request:

grpcurl -plaintext -d '{\"network_addr\":\"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\"query_type\": 0 }' 127.0.0.1:9090 stratos.register.v1.Query.DepositByNode\n

Response:

{\n  \"deposit_info\": {\n    \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n    \"pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n    },\n    \"suspend\": true,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"1000000000000000000\",\n    \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"description\": {\n      \"moniker\": \"resource-node0\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"2024-03-08T19:18:51.591341919Z\",\n    \"node_type\": 4,\n    \"bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"1000000000000000000\"\n    },\n    \"un_bonding_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    },\n    \"un_bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    }\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-depositbyowner","title":"- DepositByOwner","text":"

Get all deposit info of a specific owner

Request:

grpcurl -plaintext -d '{\"owner_addr\":\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\", \"pagination\": {\"limit\":20}}' 127.0.0.1:9090 stratos.register.v1.Query.DepositByOwner\n

Response:

{\n  \"deposit_infos\": [\n    {\n      \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n      \"pubkey\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n      },\n      \"suspend\": true,\n      \"status\": \"BOND_STATUS_BONDED\",\n      \"tokens\": \"1000000000000000000\",\n      \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"description\": {\n        \"moniker\": \"resource-node0\",\n        \"identity\": \"\",\n        \"website\": \"\",\n        \"security_contact\": \"\",\n        \"details\": \"\"\n      },\n      \"creation_time\": \"2024-03-08T19:18:51.591341919Z\",\n      \"node_type\": 4,\n      \"bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"1000000000000000000\"\n      },\n      \"un_bonding_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      },\n      \"un_bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      }\n    },\n    {\n      \"network_address\": \"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\",\n      \"pubkey\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ=\"\n      },\n      \"suspend\": false,\n      \"status\": \"BOND_STATUS_BONDED\",\n      \"tokens\": \"100000000000000000000\",\n      \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"description\": {\n        \"moniker\": \"snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888\",\n        \"identity\": \"\",\n        \"website\": \"\",\n        \"security_contact\": \"\",\n        \"details\": \"\"\n      },\n      \"creation_time\": \"0001-01-01T00:00:00Z\",\n      \"node_type\": 0,\n      \"bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"100000000000000000000\"\n      },\n      \"un_bonding_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      },\n      \"un_bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"2\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-deposittotal","title":"- DepositTotal","text":"

Query total deposit state of all registered resource nodes and meta nodes

Request:

 grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.DepositTotal\n

Response:

{\n  \"resource_nodes_total_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"1000000000000000000\"\n  },\n  \"meta_nodes_total_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"400000000000000000000\"\n  },\n  \"total_bonded_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"401000000000000000000\"\n  },\n  \"total_unbonded_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"0\"\n  },\n  \"total_unbonding_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"0\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-bondedresourcenodecount","title":"- BondedResourceNodeCount","text":"

Queries total number of Bonded ResourceNodes

Request:

grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.BondedResourceNodeCount\n

Response:

{\n  \"number\": \"2\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-bondedmetanodecount","title":"- BondedMetaNodeCount","text":"

Queries total number of Bonded MetaNodes

Request:

grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.BondedMetaNodeCount\n

Response:

{\n  \"number\": \"4\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-remainingozonelimit","title":"- RemainingOzoneLimit","text":"

Queries the current remaining ozone limit

Request:

grpcurl -plaintext 127.0.0.1:9090 stratos.register.v1.Query.RemainingOzoneLimit\n

Response:

{\n  \"ozone_limit\": \"400000000000000\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#sds-module","title":"SDS Module","text":""},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#grpc-gateway_1","title":"gRPC Gateway","text":"Method Name Request Type Response Type Description Fileupload QueryFileUploadRequest fields:{\"file_hash\":string} QueryFileUploadResponse fields:{\"file_info\":FileInfo} Query uploaded file info by hash SimPrepay QuerySimPrepayRequest fields:{\"amount\":string} QuerySimPrepayResponse fields:{\"noz\":string} Simulate prepay to query the noz that can be purchased at the current price NozPrice QueryNozPriceRequest fields:{} QueryNozPriceResponse fields:{\"price\":string} Query the current price of noz NozSupply QueryNozSupplyRequest fields:{} QueryNozSupplyResponse fields:{\"remaining\":string,\"total\":string} Query noz supply Params QueryParamsRequest fields:{} QueryParamsResponse fields:{\"params\":Params} Get params of SDS Module

FileInfo:

Field Type Label height string reporters bytes uploader string

Params:

Field Type Label bond_denom string"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-list_1","title":"- List","text":"

List all available grpc queries in SDS Module

Request:

 grpcurl -plaintext 127.0.0.1:9090 list stratos.sds.v1.Query\n

Response:

stratos.sds.v1.Query.Fileupload\nstratos.sds.v1.Query.SimPrepay\nstratos.sds.v1.Query.NozPrice\nstratos.sds.v1.Query.NozSupply\nstratos.sds.v1.Query.Params\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-fileupload","title":"- Fileupload","text":"

Query uploaded file info by hash

Request:

 grpcurl -plaintext -d '{\"file_hash\":\"v05ahm51dd62ise3fo7ojqub90p0ql2c3jg37hk8\"}' 127.0.0.1:9090 stratos.sds.v1.Query.Fileupload\n

Response:

{\n    \"file_info\": {\n        \"height\": \"4109\",\n        \"reporters\": \"DwAAAAAAAAA=\",\n        \"uploader\": \"st18986jyng5vsprmtzkdxla80jrw7qyc6wl73h0u\"\n    }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-simprepay","title":"- SimPrepay","text":"

Simulate prepay to query the noz that can be purchased at the current price

Request:

 grpcurl -plaintext -d '{\"amount\":\"1stos\"}' 127.0.0.1:9090 stratos.sds.v1.Query.SimPrepay\n

Response:

{\n  \"noz\": \"949522847536\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-nozprice","title":"- NozPrice","text":"

Query the current price of noz

Request:

 grpcurl -plaintext 127.0.0.1:9090 stratos.sds.v1.Query.NozPrice\n

Response:

{\n    \"price\": \"1012791644248016784459322\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-nozsupply","title":"- NozSupply","text":"

Query noz supply

Request:

 grpcurl -plaintext 127.0.0.1:9090 stratos.sds.v1.Query.NozSupply\n

Response:

{\n    \"remaining\": \"7949398620856330560\",\n    \"total\": \"8000080000000000000\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-params_1","title":"- Params","text":"

Get params of SDS Module

Request:

 grpcurl -plaintext 127.0.0.1:9090 stratos.sds.v1.Query.Params\n

Response:

{\n    \"params\": {\n        \"bond_denom\": \"wei\"\n    }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#pot-module","title":"POT Module","text":""},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#grpc-gateway_2","title":"gRPC Gateway","text":"Method Name Request Type Response Type Description VolumeReport QueryVolumeReportRequest fields:{\"epoch\":int64} QueryVolumeReportResponse fields:{\"report_info\":ReportInfo } Get pot volume report by epoch RewardsByEpoch QueryRewardsByEpochRequest fields:{\"epoch\":int64,\"pagination\":cosmos.base.query.v1beta1.PageRequest} QueryRewardsByEpochResponse fields:{\"rewards\":[]Reward,\"pagination\":cosmos.base.query.v1beta1.PageResponse} Query pot reward by epoch RewardsByWallet QueryRewardsByWalletRequest fields:{\"wallet_address\":string} QueryRewardsByWalletResponse fields:{\"rewards\":RewardByWallet} Get pot reward by beneficiary address RewardsByWalletAndEpoch QueryRewardsByWalletAndEpochRequest fields:{\"wallet_address\":string,\"epoch\":int64,\"pagination\":cosmos.base.query.v1beta1.PageRequest} QueryRewardsByWalletAndEpochResponse fields:{\"rewards\":[]Reward,\"pagination\":cosmos.base.query.v1beta1.PageResponse} Get pot reward by beneficiary address and epoch SlashingByOwner QuerySlashingByOwnerRequest fields:{\"wallet_address\":string} QuerySlashingByOwnerResponse fields:{\"slashing\":string} Get pot slashing by owner Params QueryParamsRequest fields:{} QueryParamsResponse fields:{\"params\":Params} Get params of POT Module TotalMinedToken QueryTotalMinedTokenRequest fields:{} QueryTotalMinedTokenResponse fields:{\"total_mined_token\": cosmos.base.v1beta1.Coin} Get total mined token CirculationSupply QueryCirculationSupplyRequest fields:{} QueryCirculationSupplyResponse fields:{\"circulation_supply\":[]cosmos.base.v1beta1.Coin} Get circulation supply

ReportInfo:

Field Type Label epoch int64 reference string tx_hash string reporter string

Reward:

Field Type Label wallet_address string reward_from_mining_pool cosmos.base.v1beta1.Coin repeated reward_from_traffic_pool cosmos.base.v1beta1.Coin repeated

RewardByWallet:

Field Type Label wallet_address string mature_total_reward cosmos.base.v1beta1.Coin repeated immature_total_reward cosmos.base.v1beta1.Coin repeated

Params:

Field Type Label bond_denom string reward_denom string mature_epoch int64 mining_reward_params MiningRewardParam repeated community_tax string initial_total_supply cosmos.base.v1beta1.Coin

MiningRewardParam:

Field Type Label total_mined_valve_start cosmos.base.v1beta1.Coin total_mined_valve_end cosmos.base.v1beta1.Coin mining_reward cosmos.base.v1beta1.Coin block_chain_percentage_in_bp string resource_node_percentage_in_bp string meta_node_percentage_in_bp string"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-list_2","title":"- List","text":"

List all available grpc queries in POT Module

Request:

 grpcurl -plaintext 127.0.0.1:9090 list stratos.pot.v1.Query\n

Response:

stratos.pot.v1.Query.VolumeReport\nstratos.pot.v1.Query.RewardsByEpoch\nstratos.pot.v1.Query.RewardsByWallet\nstratos.pot.v1.Query.RewardsByWalletAndEpoch\nstratos.pot.v1.Query.SlashingByOwner\nstratos.pot.v1.Query.Params\nstratos.pot.v1.Query.TotalMinedToken\nstratos.pot.v1.Query.CirculationSupply\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-volumereport","title":"- VolumeReport","text":"

Get pot volume report by epoch

Request:

grpcurl -plaintext -d '{\"epoch\": 1 }' 127.0.0.1:9090 stratos.pot.v1.Query.VolumeReport\n

Response:

{\n  \"report_info\": {\n    \"epoch\": \"1\",\n    \"reference\": \"100A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F\",\n    \"tx_hash\": \"7F51147DB44185A1A4DC572EC0C69DEA6E9495DDCDF27CD46CA27935D4B93943\",\n    \"reporter\": \"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-rewardsbyepoch","title":"- RewardsByEpoch","text":"

Query pot reward by epoch

Request:

grpcurl -plaintext -d '{\"epoch\": 1}' 127.0.0.1:9090 stratos.pot.v1.Query.RewardsByEpoch\n

Response:

{\n  \"rewards\": [\n    {\n      \"wallet_address\": \"st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\",\n      \"reward_from_mining_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"4000000000000000000\"\n        }\n      ],\n      \"reward_from_traffic_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"25740279520266\"\n        }\n      ]\n    },\n    {\n      \"wallet_address\": \"st1k9hfqps9s2tpnfxch2avvevyvtry0zth39gdzc\",\n      \"reward_from_mining_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"4000000000000000000\"\n        }\n      ],\n      \"reward_from_traffic_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"25740279520266\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": \"y0JUWCEwpMwgs3XzfSwlHBHU9Xg=\",\n    \"total\": \"0\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-rewardsbywallet","title":"- RewardsByWallet","text":"

Get pot reward by beneficiary address

Request:

grpcurl -plaintext -d '{\"wallet_address\": \"st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\"} ' 127.0.0.1:9090 stratos.pot.v1.Query.RewardsByWallet\n

Response:

{\n  \"rewards\": {\n    \"wallet_address\": \"st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\",\n    \"mature_total_reward\": [],\n    \"immature_total_reward\": [\n      {\n        \"denom\": \"wei\",\n        \"amount\": \"16000257399827064713\"\n      }\n    ]\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-rewardsbywalletandepoch","title":"- RewardsByWalletAndEpoch","text":"

Get pot reward by beneficiary address and epoch

Request:

grpcurl -plaintext -d '{\"wallet_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\", \"epoch\": 2} ' 127.0.0.1:9090 stratos.pot.v1.Query.RewardsByWalletAndEpoch\n

Response:

{\n  \"rewards\": [\n    {\n      \"wallet_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"reward_from_mining_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"52000000000000000000\"\n        }\n      ],\n      \"reward_from_traffic_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"669244695117639\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"0\"\n  }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-slashingbyowner","title":"- SlashingByOwner","text":"

Get pot slashing by owner

Request:

grpcurl -plaintext -d '{\"wallet_address\": \"st16uzr20lx072gexwjuvg94hz3t8y73u4085s9sw\"} ' 127.0.0.1:9090 stratos.pot.v1.Query.SlashingByOwner\n

Response:

{\n \"slashing\": \"0\"\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-params_2","title":"- Params","text":"

Get params of POT Module

Request:

 grpcurl -plaintext 127.0.0.1:9090 stratos.pot.v1.Query.Params\n

Response:

{\n  \"params\": {\n    \"bond_denom\": \"wei\",\n    \"reward_denom\": \"wei\",\n    \"mature_epoch\": \"2016\",\n    \"mining_reward_params\": [\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"0\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"16819200000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"80000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6000\",\n        \"meta_node_percentage_in_bp\": \"2000\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"16819200000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"25228800000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"40000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6200\",\n        \"meta_node_percentage_in_bp\": \"1800\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"25228800000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"29433600000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"20000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6400\",\n        \"meta_node_percentage_in_bp\": \"1600\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"29433600000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"31536000000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"10000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6600\",\n        \"meta_node_percentage_in_bp\": \"1400\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"31536000000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"32587200000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"5000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6800\",\n        \"meta_node_percentage_in_bp\": \"1200\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"32587200000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"40000000000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"2500000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"7000\",\n        \"meta_node_percentage_in_bp\": \"1000\"\n      }\n    ],\n    \"community_tax\": \"0.020000000000000000\",\n    \"initial_total_supply\": {\n      \"denom\": \"wei\",\n      \"amount\": \"100000000000000000000000000\"\n    }\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-totalminedtoken","title":"- TotalMinedToken","text":"

Get total mined token

Request:

grpcurl -plaintext 127.0.0.1:9090 stratos.pot.v1.Query.TotalMinedToken\n

Response:

{\n  \"total_mined_token\": {\n    \"denom\": \"wei\",\n    \"amount\": \"959999999923\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-grpc-queries/#-circulationsupply","title":"- CirculationSupply","text":"

Get circulation supply

Request:

grpcurl -plaintext 127.0.0.1:9090 stratos.pot.v1.Query.CirculationSupply\n

Response:

{\n  \"circulation_supply\": [\n    {\n      \"denom\": \"wei\",\n      \"amount\": \"441331088285529367702468752\"\n    }\n  ]\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/","title":"Stratos Chain stchaind REST APIs","text":""},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#overview","title":"Overview","text":"

Generally, all the APIs provided here could be grouped into HTTP GET and POST requests. We classified these APIs into sections based on their modules or their operations for an in-depth analysis.

  • GET Request

The response content type is application/json

  • POST Request

The response content type is application/json. If it has a request body, the request content is also in application/json format.

A POST request will return an unsigned transaction, which equals to its equivalent stchaind command with a --generate-only flag.

"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#stratos-chain-rest-apis","title":"Stratos-chain REST APIs","text":"

Tip

Replace rest.thestratos.org with rest.thestratos.org for Testnet queries.

"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#node-status","title":"Node Status","text":"GET /status \u00a0\u00a0\u00a0\u00a0\u00a0queries information about the connected node Request Example:
https://rpc.thestratos.org/status\n
Response Example:
{\n  \"jsonrpc\": \"2.0\",\n  \"id\": -1,\n  \"result\": {\n    \"node_info\": {\n      \"protocol_version\": {\n        \"p2p\": \"8\",\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"id\": \"173ebeb219ae7e8d53e7882063429213b9176b6f\",\n      \"listen_addr\": \"tcp://0.0.0.0:26656\",\n      \"network\": \"testchain\",\n      \"version\": \"0.37.2\",\n      \"channels\": \"40202122233038606100\",\n      \"moniker\": \"node\",\n      \"other\": {\n        \"tx_index\": \"on\",\n        \"rpc_address\": \"tcp://127.0.0.1:26657\"\n      }\n    },\n    \"sync_info\": {\n      \"latest_block_hash\": \"0F9E487D5536E51A394674DA4238D7A9A6FC5B6914337C85B2246736DCA920C6\",\n      \"latest_app_hash\": \"2163AE296ACA24085E56D9DC422EC530A3DA99925E621DCA9DDDC51FBF70B50F\",\n      \"latest_block_height\": \"1155\",\n      \"latest_block_time\": \"2024-03-07T22:52:06.74704475Z\",\n      \"earliest_block_hash\": \"351DCDB243332806931B7FCD220C442E03A69AD97004CB2078F70ADEA38DB52A\",\n      \"earliest_app_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n      \"earliest_block_height\": \"1\",\n      \"earliest_block_time\": \"2024-03-07T14:14:09.179630523Z\",\n      \"catching_up\": false\n    },\n    \"validator_info\": {\n      \"address\": \"05949FEF030908686B36079C8BE958EE412D8744\",\n      \"pub_key\": {\n        \"type\": \"tendermint/PubKeyEd25519\",\n        \"value\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n      },\n      \"voting_power\": \"504000000000000\"\n    }\n  }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#tendermint-rpc","title":"Tendermint RPC","text":"

Tendermint APIs, such as query blocks, transactions and validator set

GET /block?height={height} \u00a0\u00a0\u00a0\u00a0\u00a0 queries a block at a specific {height} Request Example:
https://rpc.thestratos.org/block?height=3\n
Response Example:
{\n  \"jsonrpc\": \"2.0\",\n  \"id\": -1,\n  \"result\": {\n    \"block_id\": {\n      \"hash\": \"0D743AAB873C590EAEE65A82036B0E2719A8C5FB6BCC6AD4BFE5E16A6D2384D9\",\n      \"parts\": {\n        \"total\": 1,\n        \"hash\": \"9AEE29A0BCF4478CB648760024DC1BC62A0CF1E7CD8F518F5A952C6A51A4C519\"\n      }\n    },\n    \"block\": {\n      \"header\": {\n        \"version\": {\n          \"block\": \"11\"\n        },\n        \"chain_id\": \"testchain\",\n        \"height\": \"3\",\n        \"time\": \"2024-03-07T21:15:18.727039882Z\",\n        \"last_block_id\": {\n          \"hash\": \"47380D904092AD1CAB0D6EE05529108E1C16DDA57DA548F92B808826B57BFC2F\",\n          \"parts\": {\n            \"total\": 1,\n            \"hash\": \"5636DB87347A6B6688311A8337BC072B42F6A711A79B03E059669AC18BA369F8\"\n          }\n        },\n        \"last_commit_hash\": \"EE243348801D7A14265326D57A87F5411514DF4488E0F9A0D1CB5EFA4C59302E\",\n        \"data_hash\": \"880D0616234E0498E005E4BE6D14CD2B4B973808CBC5123F6CB94B55F412CE1E\",\n        \"validators_hash\": \"FC72D5166A86C81AFD8405DD7788E9C56531E8AA69A1ADDD1C1F3132D2A665CD\",\n        \"next_validators_hash\": \"FC72D5166A86C81AFD8405DD7788E9C56531E8AA69A1ADDD1C1F3132D2A665CD\",\n        \"consensus_hash\": \"048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F\",\n        \"app_hash\": \"2879EC791843B2FA808D7914D8554252F9724A8ADD953806AC5CE48405233B1C\",\n        \"last_results_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n        \"evidence_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n        \"proposer_address\": \"05949FEF030908686B36079C8BE958EE412D8744\"\n      },\n      \"data\": {\n        \"txs\": [\n          \"CtgCCtUCCiUvY29zbW9zLmdvdi52MWJldGExLk1zZ1N1Ym1pdFByb3Bvc2FsEqsCCv0BCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEsoBChR1cGRhdGUgdm90aW5nIHBhcmFtcxIUdXBkYXRlIHZvdGluZyBwZXJpb2QaLwoDZ292Egx2b3RpbmdwYXJhbXMaGnsidm90aW5nX3BlcmlvZCI6ICI4NjQwMCJ9GmsKA2dvdhINZGVwb3NpdHBhcmFtcxpVeyJtaW5fZGVwb3NpdCI6IFt7ImRlbm9tIjogIndlaSIsImFtb3VudCI6ICIxMDAwMDAwIn1dLCJtYXhfZGVwb3NpdF9wZXJpb2QiOiAiODY0MDAifRopc3QxZWRwOWdrcHB4emp2Y2c5bndoZWg2dHA5cnNnYWZhdGNrZmRsNm0SdwpXCk0KJi9zdHJhdG9zLmNyeXB0by52MS5ldGhzZWNwMjU2azEuUHViS2V5EiMKIQNBlPndlLdbenThBfi5/mQPaDXY4fL0x4Vm+/PEzgiFKxIECgIIARgBEhwKFgoDd2VpEg83MTk0ODYwMDAwMDAwMDAQ/vQrGkFPkIR+nuWxlSCMABNwvragzNLy0REfuAJibSYiA05YfiDwdIYtUhgvZXvD02Kh4YbVSmVIY0IyiesiHP3884EYAA==\"\n        ]\n      },\n      \"evidence\": {\n        \"evidence\": []\n      },\n      \"last_commit\": {\n        \"height\": \"2\",\n        \"round\": 0,\n        \"block_id\": {\n          \"hash\": \"47380D904092AD1CAB0D6EE05529108E1C16DDA57DA548F92B808826B57BFC2F\",\n          \"parts\": {\n            \"total\": 1,\n            \"hash\": \"5636DB87347A6B6688311A8337BC072B42F6A711A79B03E059669AC18BA369F8\"\n          }\n        },\n        \"signatures\": [\n          {\n            \"block_id_flag\": 2,\n            \"validator_address\": \"05949FEF030908686B36079C8BE958EE412D8744\",\n            \"timestamp\": \"2024-03-07T21:15:18.727039882Z\",\n            \"signature\": \"QwMSz37OTLM0nBLnfg2ct7FdjZRyA8nYhi+vFRUK3Wb2boX/OiKN6r/LUxo/JxwCkhsXJWJI/HOnHV+SE6qYDA==\"\n          }\n        ]\n      }\n    }\n  }\n}\n

GET /validators?height={height} \u00a0\u00a0\u00a0\u00a0\u00a0 queries validator set at certain {height} Request Example:
https://rpc.thestratos.org/validators?height=800\n
Response Example:
{\n  \"jsonrpc\": \"2.0\",\n  \"id\": -1,\n  \"result\": {\n    \"block_height\": \"800\",\n    \"validators\": [\n      {\n        \"address\": \"05949FEF030908686B36079C8BE958EE412D8744\",\n        \"pub_key\": {\n          \"type\": \"tendermint/PubKeyEd25519\",\n          \"value\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n        },\n        \"voting_power\": \"504000000000000\",\n        \"proposer_priority\": \"0\"\n      }\n    ],\n    \"count\": \"1\",\n    \"total\": \"1\"\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#auth","title":"Auth","text":"GET /cosmos/auth/v1beta1/accounts \u00a0\u00a0\u00a0\u00a0\u00a0 queries the account information on blockchain Request Example:
https://rest.thestratos.org/cosmos/auth/v1beta1/accounts\n
Response Example:
{\n  \"accounts\": [\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\",\n      \"pub_key\": null,\n      \"account_number\": \"7\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st1fz67scxv3hjy0nxafuf0c4made74gfcf7myjqg\",\n        \"pub_key\": null,\n        \"account_number\": \"15\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"meta_node_bonded_pool\",\n      \"permissions\": [\n        \"minter\"\n      ]\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3fkaac2\",\n        \"pub_key\": null,\n        \"account_number\": \"11\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"bonded_tokens_pool\",\n      \"permissions\": [\n        \"burner\",\n        \"staking\"\n      ]\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st1tygms3xhhs3yv487phx3dw4a95jn7t7lakpvw7\",\n        \"pub_key\": null,\n        \"account_number\": \"12\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"not_bonded_tokens_pool\",\n      \"permissions\": [\n        \"burner\",\n        \"staking\"\n      ]\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1vvysda6ylqz2adauqg4djsz4rx6hv6mqv9fepp\",\n      \"pub_key\": null,\n      \"account_number\": \"3\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw\",\n        \"pub_key\": null,\n        \"account_number\": \"13\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"gov\",\n      \"permissions\": [\n        \"burner\"\n      ]\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1sqzsk8mplv5248gx6dddzzxweqvew8rtst96fx\",\n      \"pub_key\": null,\n      \"account_number\": \"1\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8mjswgz\",\n        \"pub_key\": null,\n        \"account_number\": \"10\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"distribution\",\n      \"permissions\": [\n        \"burner\"\n      ]\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st144ykkar9fhl8khs7lwz0s7py9vj4w9adp37kt9\",\n      \"pub_key\": null,\n      \"account_number\": \"2\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1k9hfqps9s2tpnfxch2avvevyvtry0zth39gdzc\",\n      \"pub_key\": null,\n      \"account_number\": \"8\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"pub_key\": {\n        \"@type\": \"/stratos.crypto.v1.ethsecp256k1.PubKey\",\n        \"key\": \"A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr\"\n      },\n      \"account_number\": \"0\",\n      \"sequence\": \"2\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1ewlfmhl8j0p2jesfd2xrqp0qjeh2222gs9uefh\",\n      \"pub_key\": null,\n      \"account_number\": \"6\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st1m3h30wlvsf8llruxtpukdvsy0km2kum85un2xa\",\n        \"pub_key\": null,\n        \"account_number\": \"14\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"mint\",\n      \"permissions\": [\n        \"minter\"\n      ]\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st1a8ngk4tjvuxneyuvyuy9nvgehkpfa38hm8mp3x\",\n      \"pub_key\": null,\n      \"account_number\": \"5\",\n      \"sequence\": \"0\"\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.ModuleAccount\",\n      \"base_account\": {\n        \"address\": \"st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q\",\n        \"pub_key\": null,\n        \"account_number\": \"9\",\n        \"sequence\": \"0\"\n      },\n      \"name\": \"fee_collector\",\n      \"permissions\": []\n    },\n    {\n      \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n      \"address\": \"st172v4u8ysfgaphjs8uyy0svvc6d6tzl6gp07kn4\",\n      \"pub_key\": null,\n      \"account_number\": \"4\",\n      \"sequence\": \"0\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"16\"\n  }\n}\n
GET /cosmos/auth/v1beta1/accounts/{address} \u00a0\u00a0\u00a0\u00a0\u00a0 queries the account information on blockchain Request Example:
https://rest.thestratos.org/cosmos/auth/v1beta1/accounts/st1v33vxhmu9kp9yrncfldvt0zg9qlcepc75lyggk\n
Response Example:
{\n    \"account\": {\n        \"@type\": \"/cosmos.auth.v1beta1.BaseAccount\",\n        \"address\": \"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\",\n        \"pub_key\": {\n            \"@type\": \"/stratos.crypto.v1.ethsecp256k1.PubKey\",\n            \"key\": \"Agkwb1xacHBqeqGBIqRacXgf0qKTnEBPCEtH2vTE01Ke\"\n        },\n        \"account_number\": \"0\",\n        \"sequence\": \"4\"\n    }\n}\n
GET /cosmos/auth/v1beta1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries all parameters of Auth module. Request Example:
https://rest.thestratos.org/cosmos/auth/v1beta1/params\n
Response Example:
{\n    \"params\": {\n        \"max_memo_characters\": \"256\",\n        \"tx_sig_limit\": \"7\",\n        \"tx_size_cost_per_byte\": \"1000\",\n        \"sig_verify_cost_ed25519\": \"59000\",\n        \"sig_verify_cost_secp256k1\": \"100000\"\n    }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#bank","title":"Bank","text":"GET /cosmos/bank/v1beta1/balances/{address} \u00a0\u00a0\u00a0\u00a0\u00a0 queries the balance of all coins for a single account Request Example:
https://rest.thestratos.org/cosmos/bank/v1beta1/balances/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\n
Response Example:
{\n  \"balances\": [\n    {\n      \"denom\": \"wei\",\n      \"amount\": \"99991399999400000000000000\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/bank/v1beta1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries the parameters of Bank module. Request Example:
https://rest.thestratos.org/cosmos/bank/v1beta1/params\n
Response Example:
{\n    \"params\": {\n        \"send_enabled\": [],\n        \"default_send_enabled\": true\n    }\n}\n
GET /cosmos/bank/v1beta1/supply \u00a0\u00a0\u00a0\u00a0\u00a0 returns total supply of coins in the chain Request Example:
https://rest.thestratos.org/cosmos/bank/v1beta1/supply\n
Response Example:
{\n  \"supply\": [\n    {\n      \"denom\": \"wei\",\n      \"amount\": \"100000000000000000000000000\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/bank/v1beta1/supply/by_denom?denom={denom} \u00a0\u00a0\u00a0\u00a0\u00a0 queries the supply of a single coin Request Example:
https://rest.thestratos.org/cosmos/bank/v1beta1/supply/by_denom?denom=wei\n
Response Example:
{\n    \"amount\": {\n        \"denom\": \"wei\",\n        \"amount\": \"21000519539308644119443444\"\n    }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#distribution","title":"Distribution","text":"GET /cosmos/distribution/v1beta1/community_pool \u00a0\u00a0\u00a0\u00a0\u00a0 queries the community pool coins Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/community_pool\n
Response Example:
{\n    \"pool\": [\n        {\n            \"denom\": \"wei\",\n            \"amount\": \"10529239257213782433.160000000000000000\"\n        }\n    ]\n}\n
GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards \u00a0\u00a0\u00a0\u00a0\u00a0 queries the total rewards accrued by each validator. Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/rewards\n
Response Example:
{\n    \"rewards\": [\n        {\n            \"validator_address\": \"stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\",\n            \"reward\": [\n                {\n                    \"denom\": \"wei\",\n                    \"amount\": \"470444828785397799437.412000000000000000\"\n                }\n            ]\n        }\n    ],\n    \"total\": [\n        {\n            \"denom\": \"wei\",\n            \"amount\": \"470444828785397799437.412000000000000000\"\n        }\n    ]\n}\n
GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address} \u00a0\u00a0\u00a0\u00a0\u00a0 queries the total rewards accrued by a delegation Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/rewards/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n
Response Example:
{\n    \"rewards\": [\n        {\n            \"denom\": \"wei\",\n            \"amount\": \"513182961214751918939.940000000000000000\"\n        }\n    ]\n}\n
GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/validators \u00a0\u00a0\u00a0\u00a0\u00a0 queries the validators of a delegator Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/validators\n
Response Example:
{\n    \"validators\": [\n        \"stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\"\n    ]\n}\n
GET /cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address \u00a0\u00a0\u00a0\u00a0\u00a0 queries withdraw address of a delegator Request Example:
https://rest.thestratos.org/cosmos/distribution/delegators/st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh/withdraw_address\n
Response Example:
{\n  \"withdraw_address\": \"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\"\n}\n
GET /cosmos/distribution/v1beta1/validators/{validator_address}/commission \u00a0\u00a0\u00a0\u00a0\u00a0 queries accumulated commission for a validator. Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu/commission\n
Response Example:
{\n    \"commission\": {\n        \"commission\": [\n            {\n                \"denom\": \"wei\",\n                \"amount\": \"61811505831634070383.438000000000000000\"\n            }\n        ]\n    }\n}\n
GET /cosmos/distribution/v1beta1/validators/{validatorAddr} \u00a0\u00a0\u00a0\u00a0\u00a0 queries validator distribution information Request Example:
https://rest.thestratos.org//cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu\n
Response Example:
{\n  \"operator_address\": \"st1pvyjzlhwrpgklu0044at4t6qh7m23k3kr2gsjh\",\n  \"self_bond_rewards\": [\n    {\n      \"denom\": \"wei\",\n      \"amount\": \"589121578147958674973.028000000000000000\"\n    }\n  ],\n  \"commission\": [\n    {\n      \"denom\": \"wei\",\n      \"amount\": \"65457953127550963885.892000000000000000\"\n    }\n  ]\n}\n
GET /cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards \u00a0\u00a0\u00a0\u00a0\u00a0 queries outstanding rewards of a validator address Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu/outstanding_rewards\n
Response Example:
{\n    \"rewards\": {\n        \"rewards\": [\n            {\n                \"denom\": \"wei\",\n                \"amount\": \"664331752904189049948.100000000000000000\"\n            }\n        ]\n    }\n}\n
GET /cosmos/distribution/v1beta1/validators/{validator_address}/slashes \u00a0\u00a0\u00a0\u00a0\u00a0 queries slash events of a validator Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/validators/stvaloper1pvyjzlhwrpgklu0044at4t6qh7m23k3k5xpswu/slashes\n
Response Example:
{\n    \"slashes\": [\n    ],\n    \"pagination\": {\n        \"next_key\": null,\n        \"total\": \"0\"\n    }\n}\n
GET /cosmos/distribution/v1beta1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries params of the distribution module Request Example:
https://rest.thestratos.org/cosmos/distribution/v1beta1/params\n
Response Example:
{\n    \"params\": {\n        \"community_tax\": \"0.020000000000000000\",\n        \"base_proposer_reward\": \"0.010000000000000000\",\n        \"bonus_proposer_reward\": \"0.040000000000000000\",\n        \"withdraw_addr_enabled\": true\n    }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#gov","title":"Gov","text":"GET /cosmos/gov/v1/proposals \u00a0\u00a0\u00a0\u00a0\u00a0 queries all proposals information Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals\n
Response Example:
{\n  \"proposals\": [\n    {\n      \"id\": \"1\",\n      \"messages\": [\n        {\n          \"@type\": \"/cosmos.gov.v1.MsgExecLegacyContent\",\n          \"content\": {\n            \"@type\": \"/cosmos.params.v1beta1.ParameterChangeProposal\",\n            \"title\": \"update voting params\",\n            \"description\": \"update voting period\",\n            \"changes\": [\n              {\n                \"subspace\": \"gov\",\n                \"key\": \"votingparams\",\n                \"value\": \"{\\\"voting_period\\\": \\\"86400\\\"}\"\n              },\n              {\n                \"subspace\": \"gov\",\n                \"key\": \"depositparams\",\n                \"value\": \"{\\\"min_deposit\\\": [{\\\"denom\\\": \\\"wei\\\",\\\"amount\\\": \\\"1000000\\\"}],\\\"max_deposit_period\\\": \\\"86400\\\"}\"\n              }\n            ]\n          },\n          \"authority\": \"st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw\"\n        }\n      ],\n      \"status\": \"PROPOSAL_STATUS_DEPOSIT_PERIOD\",\n      \"final_tally_result\": {\n        \"yes_count\": \"0\",\n        \"abstain_count\": \"0\",\n        \"no_count\": \"0\",\n        \"no_with_veto_count\": \"0\"\n      },\n      \"submit_time\": \"2024-03-07T20:26:22.453900094Z\",\n      \"deposit_end_time\": \"2024-03-09T20:26:22.453900094Z\",\n      \"total_deposit\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"10000000000\"\n        }\n      ],\n      \"voting_start_time\": null,\n      \"voting_end_time\": null,\n      \"metadata\": \"\",\n      \"title\": \"update voting params\",\n      \"summary\": \"update voting period\",\n      \"proposer\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/gov/v1/proposals?{params} \u00a0\u00a0\u00a0\u00a0\u00a0 queries proposals information with parameters Parameters:
+ voter               voter address\n+ depositor           depositor addressvoter address\n+ proposal_status     status of the proposals\n
Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals?status=PROPOSAL_STATUS_DEPOSIT_PERIOD\n
Response Example:
{\n  \"proposals\": [\n    {\n      \"id\": \"1\",\n      \"messages\": [\n        {\n          \"@type\": \"/cosmos.gov.v1.MsgExecLegacyContent\",\n          \"content\": {\n            \"@type\": \"/cosmos.params.v1beta1.ParameterChangeProposal\",\n            \"title\": \"update voting params\",\n            \"description\": \"update voting period\",\n            \"changes\": [\n              {\n                \"subspace\": \"gov\",\n                \"key\": \"votingparams\",\n                \"value\": \"{\\\"voting_period\\\": \\\"86400\\\"}\"\n              },\n              {\n                \"subspace\": \"gov\",\n                \"key\": \"depositparams\",\n                \"value\": \"{\\\"min_deposit\\\": [{\\\"denom\\\": \\\"wei\\\",\\\"amount\\\": \\\"1000000\\\"}],\\\"max_deposit_period\\\": \\\"86400\\\"}\"\n              }\n            ]\n          },\n          \"authority\": \"st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw\"\n        }\n      ],\n      \"status\": \"PROPOSAL_STATUS_DEPOSIT_PERIOD\",\n      \"final_tally_result\": {\n        \"yes_count\": \"0\",\n        \"abstain_count\": \"0\",\n        \"no_count\": \"0\",\n        \"no_with_veto_count\": \"0\"\n      },\n      \"submit_time\": \"2024-03-07T20:26:22.453900094Z\",\n      \"deposit_end_time\": \"2024-03-09T20:26:22.453900094Z\",\n      \"total_deposit\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"10000000000\"\n        }\n      ],\n      \"voting_start_time\": null,\n      \"voting_end_time\": null,\n      \"metadata\": \"\",\n      \"title\": \"update voting params\",\n      \"summary\": \"update voting period\",\n      \"proposer\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/gov/v1/proposals/{proposal_id} \u00a0\u00a0\u00a0\u00a0\u00a0 queries proposal details based on ProposalID Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals/1\n
Response Example:
{\n  \"proposal\": {\n    \"id\": \"1\",\n    \"messages\": [\n      {\n        \"@type\": \"/cosmos.gov.v1.MsgExecLegacyContent\",\n        \"content\": {\n          \"@type\": \"/cosmos.params.v1beta1.ParameterChangeProposal\",\n          \"title\": \"update voting params\",\n          \"description\": \"update voting period\",\n          \"changes\": [\n            {\n              \"subspace\": \"gov\",\n              \"key\": \"votingparams\",\n              \"value\": \"{\\\"voting_period\\\": \\\"86400\\\"}\"\n            },\n            {\n              \"subspace\": \"gov\",\n              \"key\": \"depositparams\",\n              \"value\": \"{\\\"min_deposit\\\": [{\\\"denom\\\": \\\"wei\\\",\\\"amount\\\": \\\"1000000\\\"}],\\\"max_deposit_period\\\": \\\"86400\\\"}\"\n            }\n          ]\n        },\n        \"authority\": \"st10d07y265gmmuvt4z0w9aw880jnsr700jx08hhw\"\n      }\n    ],\n    \"status\": \"PROPOSAL_STATUS_DEPOSIT_PERIOD\",\n    \"final_tally_result\": {\n      \"yes_count\": \"0\",\n      \"abstain_count\": \"0\",\n      \"no_count\": \"0\",\n      \"no_with_veto_count\": \"0\"\n    },\n    \"submit_time\": \"2024-03-07T20:26:22.453900094Z\",\n    \"deposit_end_time\": \"2024-03-09T20:26:22.453900094Z\",\n    \"total_deposit\": [\n      {\n        \"denom\": \"wei\",\n        \"amount\": \"10000000000\"\n      }\n    ],\n    \"voting_start_time\": null,\n    \"voting_end_time\": null,\n    \"metadata\": \"\",\n    \"title\": \"update voting params\",\n    \"summary\": \"update voting period\",\n    \"proposer\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n  }\n}\n
GET /cosmos/gov/v1/proposals/{proposal_id}/deposits \u00a0\u00a0\u00a0\u00a0\u00a0 queries all deposits of a single proposal Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/deposits\n
Response Example:
{\n  \"deposits\": [\n    {\n      \"proposal_id\": \"1\",\n      \"depositor\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"amount\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"10000000000\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor} \u00a0\u00a0\u00a0\u00a0\u00a0 queries single deposit information based proposalID, depositAddr Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/deposits/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\n
Response Example:
{\n  \"deposit\": {\n    \"proposal_id\": \"1\",\n    \"depositor\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"amount\": [\n      {\n        \"denom\": \"wei\",\n        \"amount\": \"10000000000\"\n      }\n    ]\n  }\n}\n
GET /cosmos/gov/v1/proposals/{proposal_id}/votes \u00a0\u00a0\u00a0\u00a0\u00a0 queries votes of a given proposal Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/votes\n
Response Example:
{\n  \"votes\": [\n    {\n      \"proposal_id\": \"1\",\n      \"voter\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"options\": [\n        {\n          \"option\": \"VOTE_OPTION_YES\",\n          \"weight\": \"1.000000000000000000\"\n        }\n      ],\n      \"metadata\": \"\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/gov/v1/proposals/{proposal_id}/votes/{voter} \u00a0\u00a0\u00a0\u00a0\u00a0 queries voted information based on proposalID, voterAddr Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/votes/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\n
Response Example:
{\n  \"vote\": {\n    \"proposal_id\": \"1\",\n    \"voter\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"options\": [\n      {\n        \"option\": \"VOTE_OPTION_YES\",\n        \"weight\": \"1.000000000000000000\"\n      }\n    ],\n    \"metadata\": \"\"\n  }\n}\n
GET /cosmos/gov/v1/proposals/{proposal_id}/tally \u00a0\u00a0\u00a0\u00a0\u00a0 queries the tally of a proposal vote Request Example:
https://rest.thestratos.org/cosmos/gov/v1/proposals/1/tally\n
Response Example:
{\n  \"tally\": {\n    \"yes_count\": \"500000000000000000000\",\n    \"abstain_count\": \"0\",\n    \"no_count\": \"0\",\n    \"no_with_veto_count\": \"0\"\n  }\n}\n
GET /cosmos/gov/v1/params/{params_type} \u00a0\u00a0\u00a0\u00a0\u00a0 queries all parameters of the gov module Request Example:
+ params_type      params_type defines which parameters to query for, can be one of \"voting\", \"tallying\" or \"deposit\".\n
https://rest.thestratos.org/cosmos/gov/v1/params/deposit\n
Response Example:
{\n  \"voting_params\": null,\n  \"deposit_params\": {\n    \"min_deposit\": [\n      {\n        \"denom\": \"wei\",\n        \"amount\": \"10000000\"\n      }\n    ],\n    \"max_deposit_period\": \"172800s\"\n  },\n  \"tally_params\": null,\n  \"params\": {\n    \"min_deposit\": [\n      {\n        \"denom\": \"wei\",\n        \"amount\": \"10000000\"\n      }\n    ],\n    \"max_deposit_period\": \"172800s\",\n    \"voting_period\": \"172800s\",\n    \"quorum\": \"0.334000000000000000\",\n    \"threshold\": \"0.500000000000000000\",\n    \"veto_threshold\": \"0.334000000000000000\",\n    \"min_initial_deposit_ratio\": \"0.000000000000000000\",\n    \"burn_vote_quorum\": false,\n    \"burn_proposal_deposit_prevote\": false,\n    \"burn_vote_veto\": true\n  }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#mint","title":"Mint","text":"GET /cosmos/mint/v1beta1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries mint module parameters Request Example:
https://rest.thestratos.org/cosmos/mint/v1beta1/params\n
Response Example:
{\n  \"params\": {\n    \"mint_denom\": \"wei\",\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
GET /cosmos/mint/v1beta1/inflation \u00a0\u00a0\u00a0\u00a0\u00a0 queries current minting inflation value Request Example:
https://rest.thestratos.org/cosmos/mint/v1beta1/inflation\n
Response Example:
{\n  \"inflation\": \"0.130016465508894587\"\n}\n
GET /cosmos/mint/v1beta1/annual_provisions \u00a0\u00a0\u00a0\u00a0\u00a0 queries current minting annual provisions value Request Example:
https://rest.thestratos.org/cosmos/mint/v1beta1/annual_provisions\n
Response Example:
{\n  \"annual_provisions\": \"130019024060848.545708142618272810\"\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#slashing","title":"Slashing","text":"GET /cosmos/slashing/v1beta1/signing_infos \u00a0\u00a0\u00a0\u00a0\u00a0 queries signing info of all validators Request Example:
https://rest.thestratos.org/cosmos/slashing/v1beta1/signing_infos\n
Response Example:
{\n  \"info\": [\n    {\n      \"address\": \"stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\",\n      \"start_height\": \"0\",\n      \"index_offset\": \"195\",\n      \"jailed_until\": \"1970-01-01T00:00:00Z\",\n      \"tombstoned\": false,\n      \"missed_blocks_counter\": \"0\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/slashing/v1beta1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries the current slashing parameters Request Example:
https://rest.thestratos.org/cosmos/slashing/v1beta1/params\n
Response Example:
{\n  \"params\": {\n    \"signed_blocks_window\": \"100\",\n    \"min_signed_per_window\": \"0.500000000000000000\",\n    \"downtime_jail_duration\": \"600s\",\n    \"slash_fraction_double_sign\": \"0.050000000000000000\",\n    \"slash_fraction_downtime\": \"0.010000000000000000\"\n  }\n}\n
GET /cosmos/slashing/v1beta1/signing_infos/{cons_address} \u00a0\u00a0\u00a0\u00a0\u00a0 queries the signing info of given cons address Request Example:
https://rest.thestratos.org/cosmos/slashing/v1beta1/signing_infos/stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\n
Response Example:
{\n  \"val_signing_info\": {\n    \"address\": \"stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\",\n    \"start_height\": \"0\",\n    \"index_offset\": \"198\",\n    \"jailed_until\": \"1970-01-01T00:00:00Z\",\n    \"tombstoned\": false,\n    \"missed_blocks_counter\": \"0\"\n  }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#staking","title":"Staking","text":"GET /cosmos/staking/v1beta1/validators \u00a0\u00a0\u00a0\u00a0\u00a0 queries all validator candidates Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/validators\n
|:warning: By default it returns only the bonded validators| |:------------------------------------| Response Example:
{\n  \"validators\": [\n    {\n      \"operator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n      \"consensus_pubkey\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n      },\n      \"jailed\": false,\n      \"status\": \"BOND_STATUS_BONDED\",\n      \"tokens\": \"504000000000000000000\",\n      \"delegator_shares\": \"504000000000000000000.000000000000000000\",\n      \"description\": {\n        \"moniker\": \"node\",\n        \"identity\": \"\",\n        \"website\": \"\",\n        \"security_contact\": \"\",\n        \"details\": \"\"\n      },\n      \"unbonding_height\": \"0\",\n      \"unbonding_time\": \"1970-01-01T00:00:00Z\",\n      \"commission\": {\n        \"commission_rates\": {\n          \"rate\": \"0.100000000000000000\",\n          \"max_rate\": \"0.200000000000000000\",\n          \"max_change_rate\": \"0.010000000000000000\"\n        },\n        \"update_time\": \"2024-03-07T14:14:09.179630523Z\"\n      },\n      \"min_self_delegation\": \"1\",\n      \"unbonding_on_hold_ref_count\": \"0\",\n      \"unbonding_ids\": []\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/staking/v1beta1/validators/{validator_addr} \u00a0\u00a0\u00a0\u00a0\u00a0 queries validator info for given validator address Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\n
Response Example:
{\n  \"validator\": {\n    \"operator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n    \"consensus_pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n    },\n    \"jailed\": false,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"504000000000000000000\",\n    \"delegator_shares\": \"504000000000000000000.000000000000000000\",\n    \"description\": {\n      \"moniker\": \"node\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"unbonding_height\": \"0\",\n    \"unbonding_time\": \"1970-01-01T00:00:00Z\",\n    \"commission\": {\n      \"commission_rates\": {\n        \"rate\": \"0.100000000000000000\",\n        \"max_rate\": \"0.200000000000000000\",\n        \"max_change_rate\": \"0.010000000000000000\"\n      },\n      \"update_time\": \"2024-03-07T14:14:09.179630523Z\"\n    },\n    \"min_self_delegation\": \"1\",\n    \"unbonding_on_hold_ref_count\": \"0\",\n    \"unbonding_ids\": []\n  }\n}\n
GET /cosmos/staking/v1beta1/validators/{validator_addr}/delegations \u00a0\u00a0\u00a0\u00a0\u00a0 queries delegate info for given validator Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/delegations\n
Response Example:
{\n  \"delegation_responses\": [\n    {\n      \"delegation\": {\n        \"delegator_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n        \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n        \"shares\": \"4000000000000000000.000000000000000000\"\n      },\n      \"balance\": {\n        \"denom\": \"wei\",\n        \"amount\": \"4000000000000000000\"\n      }\n    },\n    {\n      \"delegation\": {\n        \"delegator_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n        \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n        \"shares\": \"500000000000000000000.000000000000000000\"\n      },\n      \"balance\": {\n        \"denom\": \"wei\",\n        \"amount\": \"500000000000000000000\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"2\"\n  }\n}\n
GET /cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr} \u00a0\u00a0\u00a0\u00a0\u00a0 queries delegate info for given validator delegator pair Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/delegations/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\n
Response Example:
{\n  \"delegation_response\": {\n    \"delegation\": {\n      \"delegator_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n      \"shares\": \"500000000000000000000.000000000000000000\"\n    },\n    \"balance\": {\n      \"denom\": \"wei\",\n      \"amount\": \"500000000000000000000\"\n    }\n  }\n}\n
GET /cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation \u00a0\u00a0\u00a0\u00a0\u00a0 queries unbonding info for given validator delegator pair Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/delegations/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/unbonding_delegation\n
Response Example:
{\n  \"unbond\": {\n    \"delegator_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n    \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n    \"entries\": [\n      {\n        \"creation_height\": \"595\",\n        \"completion_time\": \"2024-03-28T22:05:03.666256743Z\",\n        \"initial_balance\": \"1000000000000000000\",\n        \"balance\": \"1000000000000000000\",\n        \"unbonding_id\": \"1\",\n        \"unbonding_on_hold_ref_count\": \"0\"\n      }\n    ]\n  }\n}\n
GET /cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations \u00a0\u00a0\u00a0\u00a0\u00a0 queries unbonding delegations of a validator. Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs/unbonding_delegations\n
Response Example:
{\n  \"unbonding_responses\": [\n    {\n      \"delegator_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n      \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n      \"entries\": [\n        {\n          \"creation_height\": \"595\",\n          \"completion_time\": \"2024-03-28T22:05:03.666256743Z\",\n          \"initial_balance\": \"1000000000000000000\",\n          \"balance\": \"1000000000000000000\",\n          \"unbonding_id\": \"1\",\n          \"unbonding_on_hold_ref_count\": \"0\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/staking/v1beta1/delegations/{delegator_addr} \u00a0\u00a0\u00a0\u00a0\u00a0 queries all delegations of a given delegator address Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/delegations/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\n
Response Example:
{\n  \"delegation_responses\": [\n    {\n      \"delegation\": {\n        \"delegator_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n        \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n        \"shares\": \"500000000000000000000.000000000000000000\"\n      },\n      \"balance\": {\n        \"denom\": \"wei\",\n        \"amount\": \"500000000000000000000\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations \u00a0\u00a0\u00a0\u00a0\u00a0 queries redelegations of given address. Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st1fw6tcpku363yz6le7569wzzg84val68e9eayq7/redelegations\n
Response Example:
{\n    \"redelegation_responses\": [\n        {\n            \"redelegation\": {\n                \"delegator_address\": \"string\",\n                \"validator_src_address\": \"string\",\n                \"validator_dst_address\": \"string\",\n                \"entries\": [\n                    {\n                        \"creation_height\": \"string\",\n                        \"completion_time\": \"2022-07-19T19:56:04.456Z\",\n                        \"initial_balance\": \"string\",\n                        \"shares_dst\": \"string\"\n                    }\n                ]\n            },\n            \"entries\": [\n                {\n                    \"redelegation_entry\": {\n                        \"creation_height\": \"string\",\n                        \"completion_time\": \"2022-07-19T19:56:04.456Z\",\n                        \"initial_balance\": \"string\",\n                        \"shares_dst\": \"string\"\n                    },\n                    \"balance\": \"string\"\n                }\n            ]\n        }\n    ],\n    \"pagination\": {\n        \"next_key\": \"string\",\n        \"total\": \"string\"\n    }\n}\n
GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations \u00a0\u00a0\u00a0\u00a0\u00a0 queries all unbonding delegations of a given delegator address Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/unbonding_delegations\n
Response Example:
{\n  \"unbonding_responses\": [\n    {\n      \"delegator_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n      \"validator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n      \"entries\": [\n        {\n          \"creation_height\": \"595\",\n          \"completion_time\": \"2024-03-28T22:05:03.666256743Z\",\n          \"initial_balance\": \"1000000000000000000\",\n          \"balance\": \"1000000000000000000\",\n          \"unbonding_id\": \"1\",\n          \"unbonding_on_hold_ref_count\": \"0\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/validators \u00a0\u00a0\u00a0\u00a0\u00a0 queries all validators info for given delegator address. Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/validators\n
Response Example:
{\n  \"validators\": [\n    {\n      \"operator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n      \"consensus_pubkey\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n      },\n      \"jailed\": false,\n      \"status\": \"BOND_STATUS_BONDED\",\n      \"tokens\": \"504000000000000000000\",\n      \"delegator_shares\": \"504000000000000000000.000000000000000000\",\n      \"description\": {\n        \"moniker\": \"node\",\n        \"identity\": \"\",\n        \"website\": \"\",\n        \"security_contact\": \"\",\n        \"details\": \"\"\n      },\n      \"unbonding_height\": \"0\",\n      \"unbonding_time\": \"1970-01-01T00:00:00Z\",\n      \"commission\": {\n        \"commission_rates\": {\n          \"rate\": \"0.100000000000000000\",\n          \"max_rate\": \"0.200000000000000000\",\n          \"max_change_rate\": \"0.010000000000000000\"\n        },\n        \"update_time\": \"2024-03-07T14:14:09.179630523Z\"\n      },\n      \"min_self_delegation\": \"1\",\n      \"unbonding_on_hold_ref_count\": \"0\",\n      \"unbonding_ids\": []\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr} \u00a0\u00a0\u00a0\u00a0\u00a0 queries validator info for given delegator validator pair. Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/delegators/st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l/validators/stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\n
Response Example:
{\n  \"validator\": {\n    \"operator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n    \"consensus_pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n    },\n    \"jailed\": false,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"504000000000000000000\",\n    \"delegator_shares\": \"504000000000000000000.000000000000000000\",\n    \"description\": {\n      \"moniker\": \"node\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"unbonding_height\": \"0\",\n    \"unbonding_time\": \"1970-01-01T00:00:00Z\",\n    \"commission\": {\n      \"commission_rates\": {\n        \"rate\": \"0.100000000000000000\",\n        \"max_rate\": \"0.200000000000000000\",\n        \"max_change_rate\": \"0.010000000000000000\"\n      },\n      \"update_time\": \"2024-03-07T14:14:09.179630523Z\"\n    },\n    \"min_self_delegation\": \"1\",\n    \"unbonding_on_hold_ref_count\": \"0\",\n    \"unbonding_ids\": []\n  }\n}\n
GET /cosmos/staking/v1beta1/pool \u00a0\u00a0\u00a0\u00a0\u00a0 queries the current state of the staking pool Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/pool\n
Response Example:
{\n  \"pool\": {\n    \"not_bonded_tokens\": \"1000000000000000000\",\n    \"bonded_tokens\": \"504000000000000000000\"\n  }\n}\n
GET /cosmos/staking/v1beta1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries the current staking parameter values Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/params\n
Response Example:
{\n  \"params\": {\n    \"unbonding_time\": \"1814400s\",\n    \"max_validators\": 100,\n    \"max_entries\": 7,\n    \"historical_entries\": 10000,\n    \"bond_denom\": \"wei\",\n    \"min_commission_rate\": \"0.000000000000000000\"\n  }\n}\n
GET /cosmos/staking/v1beta1/historical_info/{height} \u00a0\u00a0\u00a0\u00a0\u00a0 queries the historical info for given height Request Example:
https://rest.thestratos.org/cosmos/staking/v1beta1/historical_info/700\n
Response Example:
{\n  \"hist\": {\n    \"header\": {\n      \"version\": {\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"chain_id\": \"testchain\",\n      \"height\": \"700\",\n      \"time\": \"2024-03-07T22:13:53.403600862Z\",\n      \"last_block_id\": {\n        \"hash\": \"ciQRFn0JV6YMcF5SH505JExie/8o0HHftFNGw06nbvU=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"KIlY8gHbKLbl0Yf2bPct/VURG1Fd40Cn4KK28fzzkbU=\"\n        }\n      },\n      \"last_commit_hash\": \"CmoVerksnE+b6CIfEzrPjUdNa0HDkFgZPJ8b2N+ptEI=\",\n      \"data_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"validators_hash\": \"JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=\",\n      \"next_validators_hash\": \"JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=\",\n      \"consensus_hash\": \"BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=\",\n      \"app_hash\": \"Ccf/psHVEHdBnxVSErJ9QF0YAxpZMefD/BeHsJnJzVE=\",\n      \"last_results_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"evidence_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"proposer_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\"\n    },\n    \"valset\": [\n      {\n        \"operator_address\": \"stvaloper1edp9gkppxzjvcg9nwheh6tp9rsgafatcp9ylxs\",\n        \"consensus_pubkey\": {\n          \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n          \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n        },\n        \"jailed\": false,\n        \"status\": \"BOND_STATUS_BONDED\",\n        \"tokens\": \"504000000000000000000\",\n        \"delegator_shares\": \"504000000000000000000.000000000000000000\",\n        \"description\": {\n          \"moniker\": \"node\",\n          \"identity\": \"\",\n          \"website\": \"\",\n          \"security_contact\": \"\",\n          \"details\": \"\"\n        },\n        \"unbonding_height\": \"0\",\n        \"unbonding_time\": \"1970-01-01T00:00:00Z\",\n        \"commission\": {\n          \"commission_rates\": {\n            \"rate\": \"0.100000000000000000\",\n            \"max_rate\": \"0.200000000000000000\",\n            \"max_change_rate\": \"0.010000000000000000\"\n          },\n          \"update_time\": \"2024-03-07T14:14:09.179630523Z\"\n        },\n        \"min_self_delegation\": \"1\",\n        \"unbonding_on_hold_ref_count\": \"0\",\n        \"unbonding_ids\": []\n      }\n    ]\n  }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#service","title":"Service","text":"GET /cosmos/base/tendermint/v1beta1/blocks/latest \u00a0\u00a0\u00a0\u00a0\u00a0 returns the latest block Request Example:
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/blocks/latest\n
Response Example:
{\n  \"block_id\": {\n    \"hash\": \"lBHIQTVmY69uPYLO2U+6Hc+WnTyxJCOg4KHEdE61cLg=\",\n    \"part_set_header\": {\n      \"total\": 1,\n      \"hash\": \"BI05Rm+Cu9tcyaD6MtcZT/TELH3usNEb06Ow6hAePGg=\"\n    }\n  },\n  \"block\": {\n    \"header\": {\n      \"version\": {\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"chain_id\": \"testchain\",\n      \"height\": \"838\",\n      \"time\": \"2024-03-07T22:25:29.761240552Z\",\n      \"last_block_id\": {\n        \"hash\": \"SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E=\"\n        }\n      },\n      \"last_commit_hash\": \"I11Q6Pn8ElFS6jxf2mbTg4rRUWMU0ref9ZVTodTpUPc=\",\n      \"data_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"validators_hash\": \"JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=\",\n      \"next_validators_hash\": \"JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=\",\n      \"consensus_hash\": \"BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=\",\n      \"app_hash\": \"IGWGjx9a8FbYmkpNQ5z6H/r28ZIIjWx8oTaYS1Myb7s=\",\n      \"last_results_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"evidence_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"proposer_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\"\n    },\n    \"data\": {\n      \"txs\": []\n    },\n    \"evidence\": {\n      \"evidence\": []\n    },\n    \"last_commit\": {\n      \"height\": \"837\",\n      \"round\": 0,\n      \"block_id\": {\n        \"hash\": \"SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E=\"\n        }\n      },\n      \"signatures\": [\n        {\n          \"block_id_flag\": \"BLOCK_ID_FLAG_COMMIT\",\n          \"validator_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\",\n          \"timestamp\": \"2024-03-07T22:25:29.761240552Z\",\n          \"signature\": \"ocwelTOQbyvbAuWUl8D3A3lezTsAKq+Ia/VCUVhHCGa2rE9knzmUV/zXrXtyej5eCGLaHpHRWAdu9pfcPhEUCA==\"\n        }\n      ]\n    }\n  },\n  \"sdk_block\": {\n    \"header\": {\n      \"version\": {\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"chain_id\": \"testchain\",\n      \"height\": \"838\",\n      \"time\": \"2024-03-07T22:25:29.761240552Z\",\n      \"last_block_id\": {\n        \"hash\": \"SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E=\"\n        }\n      },\n      \"last_commit_hash\": \"I11Q6Pn8ElFS6jxf2mbTg4rRUWMU0ref9ZVTodTpUPc=\",\n      \"data_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"validators_hash\": \"JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=\",\n      \"next_validators_hash\": \"JoO6Nk+7nESoqIzxXZ0RKF+BhgYedjPL5HD5LFKHwaA=\",\n      \"consensus_hash\": \"BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=\",\n      \"app_hash\": \"IGWGjx9a8FbYmkpNQ5z6H/r28ZIIjWx8oTaYS1Myb7s=\",\n      \"last_results_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"evidence_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"proposer_address\": \"stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\"\n    },\n    \"data\": {\n      \"txs\": []\n    },\n    \"evidence\": {\n      \"evidence\": []\n    },\n    \"last_commit\": {\n      \"height\": \"837\",\n      \"round\": 0,\n      \"block_id\": {\n        \"hash\": \"SdSpYG72uqNEMMV1o8ziDFPKt/PM7M00k0bwA3hUmKw=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"rAs9rndCQE5yGY5PEDlP9kz6i4HlJ/dcQbRr7BogF6E=\"\n        }\n      },\n      \"signatures\": [\n        {\n          \"block_id_flag\": \"BLOCK_ID_FLAG_COMMIT\",\n          \"validator_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\",\n          \"timestamp\": \"2024-03-07T22:25:29.761240552Z\",\n          \"signature\": \"ocwelTOQbyvbAuWUl8D3A3lezTsAKq+Ia/VCUVhHCGa2rE9knzmUV/zXrXtyej5eCGLaHpHRWAdu9pfcPhEUCA==\"\n        }\n      ]\n    }\n  }\n}\n
GET /cosmos/base/tendermint/v1beta1/blocks/{height} \u00a0\u00a0\u00a0\u00a0\u00a0 queries block for given height Request Example:
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/blocks/3\n
Response Example:
{\n  \"block_id\": {\n    \"hash\": \"DXQ6q4c8WQ6u5lqCA2sOJxmoxftrzGrUv+Xham0jhNk=\",\n    \"part_set_header\": {\n      \"total\": 1,\n      \"hash\": \"mu4poLz0R4y2SHYAJNwbxioM8efNj1GPWpUsalGkxRk=\"\n    }\n  },\n  \"block\": {\n    \"header\": {\n      \"version\": {\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"chain_id\": \"testchain\",\n      \"height\": \"3\",\n      \"time\": \"2024-03-07T21:15:18.727039882Z\",\n      \"last_block_id\": {\n        \"hash\": \"RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg=\"\n        }\n      },\n      \"last_commit_hash\": \"7iQzSIAdehQmUybVeof1QRUU30SI4Pmg0cte+kxZMC4=\",\n      \"data_hash\": \"iA0GFiNOBJjgBeS+bRTNK0uXOAjLxRI/bLlLVfQSzh4=\",\n      \"validators_hash\": \"/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=\",\n      \"next_validators_hash\": \"/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=\",\n      \"consensus_hash\": \"BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=\",\n      \"app_hash\": \"KHnseRhDsvqAjXkU2FVCUvlySordlTgGrFzkhAUjOxw=\",\n      \"last_results_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"evidence_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"proposer_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\"\n    },\n    \"data\": {\n      \"txs\": [\n        \"CtgCCtUCCiUvY29zbW9zLmdvdi52MWJldGExLk1zZ1N1Ym1pdFByb3Bvc2FsEqsCCv0BCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEsoBChR1cGRhdGUgdm90aW5nIHBhcmFtcxIUdXBkYXRlIHZvdGluZyBwZXJpb2QaLwoDZ292Egx2b3RpbmdwYXJhbXMaGnsidm90aW5nX3BlcmlvZCI6ICI4NjQwMCJ9GmsKA2dvdhINZGVwb3NpdHBhcmFtcxpVeyJtaW5fZGVwb3NpdCI6IFt7ImRlbm9tIjogIndlaSIsImFtb3VudCI6ICIxMDAwMDAwIn1dLCJtYXhfZGVwb3NpdF9wZXJpb2QiOiAiODY0MDAifRopc3QxZWRwOWdrcHB4emp2Y2c5bndoZWg2dHA5cnNnYWZhdGNrZmRsNm0SdwpXCk0KJi9zdHJhdG9zLmNyeXB0by52MS5ldGhzZWNwMjU2azEuUHViS2V5EiMKIQNBlPndlLdbenThBfi5/mQPaDXY4fL0x4Vm+/PEzgiFKxIECgIIARgBEhwKFgoDd2VpEg83MTk0ODYwMDAwMDAwMDAQ/vQrGkFPkIR+nuWxlSCMABNwvragzNLy0REfuAJibSYiA05YfiDwdIYtUhgvZXvD02Kh4YbVSmVIY0IyiesiHP3884EYAA==\"\n      ]\n    },\n    \"evidence\": {\n      \"evidence\": []\n    },\n    \"last_commit\": {\n      \"height\": \"2\",\n      \"round\": 0,\n      \"block_id\": {\n        \"hash\": \"RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg=\"\n        }\n      },\n      \"signatures\": [\n        {\n          \"block_id_flag\": \"BLOCK_ID_FLAG_COMMIT\",\n          \"validator_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\",\n          \"timestamp\": \"2024-03-07T21:15:18.727039882Z\",\n          \"signature\": \"QwMSz37OTLM0nBLnfg2ct7FdjZRyA8nYhi+vFRUK3Wb2boX/OiKN6r/LUxo/JxwCkhsXJWJI/HOnHV+SE6qYDA==\"\n        }\n      ]\n    }\n  },\n  \"sdk_block\": {\n    \"header\": {\n      \"version\": {\n        \"block\": \"11\",\n        \"app\": \"0\"\n      },\n      \"chain_id\": \"testchain\",\n      \"height\": \"3\",\n      \"time\": \"2024-03-07T21:15:18.727039882Z\",\n      \"last_block_id\": {\n        \"hash\": \"RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg=\"\n        }\n      },\n      \"last_commit_hash\": \"7iQzSIAdehQmUybVeof1QRUU30SI4Pmg0cte+kxZMC4=\",\n      \"data_hash\": \"iA0GFiNOBJjgBeS+bRTNK0uXOAjLxRI/bLlLVfQSzh4=\",\n      \"validators_hash\": \"/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=\",\n      \"next_validators_hash\": \"/HLVFmqGyBr9hAXdd4jpxWUx6Kppoa3dHB8xMtKmZc0=\",\n      \"consensus_hash\": \"BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=\",\n      \"app_hash\": \"KHnseRhDsvqAjXkU2FVCUvlySordlTgGrFzkhAUjOxw=\",\n      \"last_results_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"evidence_hash\": \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n      \"proposer_address\": \"stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\"\n    },\n    \"data\": {\n      \"txs\": [\n        \"CtgCCtUCCiUvY29zbW9zLmdvdi52MWJldGExLk1zZ1N1Ym1pdFByb3Bvc2FsEqsCCv0BCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEsoBChR1cGRhdGUgdm90aW5nIHBhcmFtcxIUdXBkYXRlIHZvdGluZyBwZXJpb2QaLwoDZ292Egx2b3RpbmdwYXJhbXMaGnsidm90aW5nX3BlcmlvZCI6ICI4NjQwMCJ9GmsKA2dvdhINZGVwb3NpdHBhcmFtcxpVeyJtaW5fZGVwb3NpdCI6IFt7ImRlbm9tIjogIndlaSIsImFtb3VudCI6ICIxMDAwMDAwIn1dLCJtYXhfZGVwb3NpdF9wZXJpb2QiOiAiODY0MDAifRopc3QxZWRwOWdrcHB4emp2Y2c5bndoZWg2dHA5cnNnYWZhdGNrZmRsNm0SdwpXCk0KJi9zdHJhdG9zLmNyeXB0by52MS5ldGhzZWNwMjU2azEuUHViS2V5EiMKIQNBlPndlLdbenThBfi5/mQPaDXY4fL0x4Vm+/PEzgiFKxIECgIIARgBEhwKFgoDd2VpEg83MTk0ODYwMDAwMDAwMDAQ/vQrGkFPkIR+nuWxlSCMABNwvragzNLy0REfuAJibSYiA05YfiDwdIYtUhgvZXvD02Kh4YbVSmVIY0IyiesiHP3884EYAA==\"\n      ]\n    },\n    \"evidence\": {\n      \"evidence\": []\n    },\n    \"last_commit\": {\n      \"height\": \"2\",\n      \"round\": 0,\n      \"block_id\": {\n        \"hash\": \"RzgNkECSrRyrDW7gVSkQjhwW3aV9pUj5K4CIJrV7/C8=\",\n        \"part_set_header\": {\n          \"total\": 1,\n          \"hash\": \"VjbbhzR6a2aIMRqDN7wHK0L2pxGnmwPgWWaawYujafg=\"\n        }\n      },\n      \"signatures\": [\n        {\n          \"block_id_flag\": \"BLOCK_ID_FLAG_COMMIT\",\n          \"validator_address\": \"BZSf7wMJCGhrNgeci+lY7kEth0Q=\",\n          \"timestamp\": \"2024-03-07T21:15:18.727039882Z\",\n          \"signature\": \"QwMSz37OTLM0nBLnfg2ct7FdjZRyA8nYhi+vFRUK3Wb2boX/OiKN6r/LUxo/JxwCkhsXJWJI/HOnHV+SE6qYDA==\"\n        }\n      ]\n    }\n  }\n}\n
GET /cosmos/base/tendermint/v1beta1/node_info \u00a0\u00a0\u00a0\u00a0\u00a0 queries the current node info Request Example:
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/node_info\n
Response Example:
{\n  \"default_node_info\": {\n    \"protocol_version\": {\n      \"p2p\": \"8\",\n      \"block\": \"11\",\n      \"app\": \"0\"\n    },\n    \"default_node_id\": \"173ebeb219ae7e8d53e7882063429213b9176b6f\",\n    \"listen_addr\": \"tcp://0.0.0.0:26656\",\n    \"network\": \"testchain\",\n    \"version\": \"0.37.2\",\n    \"channels\": \"QCAhIiMwOGBhAA==\",\n    \"moniker\": \"node\",\n    \"other\": {\n      \"tx_index\": \"on\",\n      \"rpc_address\": \"tcp://127.0.0.1:26657\"\n    }\n  },\n  \"application_version\": {\n    \"name\": \"stchain\",\n    \"app_name\": \"stchaind\",\n    \"version\": \"v0.12.0\",\n    \"git_commit\": \"\",\n    \"build_tags\": \"\",\n    \"go_version\": \"go version go1.21.7 linux/amd64\",\n    \"build_deps\": [\n      {\n        \"path\": \"cloud.google.com/go\",\n        \"version\": \"v0.110.8\",\n        \"sum\": \"h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME=\"\n      },\n      {\n        \"path\": \"cloud.google.com/go/compute/metadata\",\n        \"version\": \"v0.2.3\",\n        \"sum\": \"h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=\"\n      },\n      {\n        \"path\": \"cloud.google.com/go/iam\",\n        \"version\": \"v1.1.2\",\n        \"sum\": \"h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4=\"\n      },\n      {\n        \"path\": \"cloud.google.com/go/storage\",\n        \"version\": \"v1.30.1\",\n        \"sum\": \"h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/api\",\n        \"version\": \"v0.3.1\",\n        \"sum\": \"h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/core\",\n        \"version\": \"v0.5.1\",\n        \"sum\": \"h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/depinject\",\n        \"version\": \"v1.0.0-alpha.4\",\n        \"sum\": \"h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/errors\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/log\",\n        \"version\": \"v1.2.1\",\n        \"sum\": \"h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/math\",\n        \"version\": \"v1.2.0\",\n        \"sum\": \"h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/simapp\",\n        \"version\": \"v0.0.0-20230828070859-c9144f02dda8\",\n        \"sum\": \"h1:xQBu6b8LinrtmUkpYhCfnz9/aF1iW0BxHp7D71Z4CyI=\"\n      },\n      {\n        \"path\": \"cosmossdk.io/tools/rosetta\",\n        \"version\": \"v0.2.1\",\n        \"sum\": \"h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw=\"\n      },\n      {\n        \"path\": \"filippo.io/edwards25519\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek=\"\n      },\n      {\n        \"path\": \"github.com/99designs/keyring\",\n        \"version\": \"v1.2.1\",\n        \"sum\": \"\"\n      },\n      {\n        \"path\": \"github.com/ChainSafe/go-schnorrkel\",\n        \"version\": \"v0.0.0-20200405005733-88cbf1b4c40d\",\n        \"sum\": \"h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg=\"\n      },\n      {\n        \"path\": \"github.com/Nik-U/pbc\",\n        \"version\": \"v0.0.0-20181205041846-3e516ca0c5d6\",\n        \"sum\": \"h1:GU/vL5sj0IgGYEOIIAJ1HDI9dgqT0gJXkhXINri7Otc=\"\n      },\n      {\n        \"path\": \"github.com/VictoriaMetrics/fastcache\",\n        \"version\": \"v1.6.0\",\n        \"sum\": \"h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=\"\n      },\n      {\n        \"path\": \"github.com/armon/go-metrics\",\n        \"version\": \"v0.4.1\",\n        \"sum\": \"h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\"\n      },\n      {\n        \"path\": \"github.com/aws/aws-sdk-go\",\n        \"version\": \"v1.44.203\",\n        \"sum\": \"h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U=\"\n      },\n      {\n        \"path\": \"github.com/beorn7/perks\",\n        \"version\": \"v1.0.1\",\n        \"sum\": \"h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\"\n      },\n      {\n        \"path\": \"github.com/bgentry/go-netrc\",\n        \"version\": \"v0.0.0-20140422174119-9fd32a8b3d3d\",\n        \"sum\": \"h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=\"\n      },\n      {\n        \"path\": \"github.com/bgentry/speakeasy\",\n        \"version\": \"v0.1.1-0.20220910012023-760eaf8b6816\",\n        \"sum\": \"h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s=\"\n      },\n      {\n        \"path\": \"github.com/btcsuite/btcd\",\n        \"version\": \"v0.23.4\",\n        \"sum\": \"h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ=\"\n      },\n      {\n        \"path\": \"github.com/btcsuite/btcd/btcec/v2\",\n        \"version\": \"v2.3.2\",\n        \"sum\": \"h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=\"\n      },\n      {\n        \"path\": \"github.com/btcsuite/btcd/btcutil\",\n        \"version\": \"v1.1.2\",\n        \"sum\": \"h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ=\"\n      },\n      {\n        \"path\": \"github.com/btcsuite/btcd/chaincfg/chainhash\",\n        \"version\": \"v1.0.1\",\n        \"sum\": \"h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=\"\n      },\n      {\n        \"path\": \"github.com/cenkalti/backoff/v4\",\n        \"version\": \"v4.1.3\",\n        \"sum\": \"h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=\"\n      },\n      {\n        \"path\": \"github.com/cespare/xxhash/v2\",\n        \"version\": \"v2.2.0\",\n        \"sum\": \"h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\"\n      },\n      {\n        \"path\": \"github.com/chzyer/readline\",\n        \"version\": \"v1.5.1\",\n        \"sum\": \"h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=\"\n      },\n      {\n        \"path\": \"github.com/cockroachdb/apd/v2\",\n        \"version\": \"v2.0.2\",\n        \"sum\": \"h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E=\"\n      },\n      {\n        \"path\": \"github.com/cockroachdb/errors\",\n        \"version\": \"v1.10.0\",\n        \"sum\": \"h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU=\"\n      },\n      {\n        \"path\": \"github.com/cockroachdb/logtags\",\n        \"version\": \"v0.0.0-20230118201751-21c54148d20b\",\n        \"sum\": \"h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=\"\n      },\n      {\n        \"path\": \"github.com/cockroachdb/redact\",\n        \"version\": \"v1.1.5\",\n        \"sum\": \"h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=\"\n      },\n      {\n        \"path\": \"github.com/coinbase/rosetta-sdk-go/types\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA=\"\n      },\n      {\n        \"path\": \"github.com/cometbft/cometbft\",\n        \"version\": \"v0.37.2\",\n        \"sum\": \"\"\n      },\n      {\n        \"path\": \"github.com/cometbft/cometbft-db\",\n        \"version\": \"v0.8.0\",\n        \"sum\": \"h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo=\"\n      },\n      {\n        \"path\": \"github.com/confio/ics23/go\",\n        \"version\": \"v0.9.0\",\n        \"sum\": \"h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/btcutil\",\n        \"version\": \"v1.0.5\",\n        \"sum\": \"h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/cosmos-proto\",\n        \"version\": \"v1.0.0-beta.2\",\n        \"sum\": \"h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/cosmos-sdk\",\n        \"version\": \"v0.47.5\",\n        \"sum\": \"\"\n      },\n      {\n        \"path\": \"github.com/cosmos/go-bip39\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/gogogateway\",\n        \"version\": \"v1.2.0\",\n        \"sum\": \"h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/gogoproto\",\n        \"version\": \"v1.4.10\",\n        \"sum\": \"h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoKuI=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/iavl\",\n        \"version\": \"v0.20.0\",\n        \"sum\": \"h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/ibc-go/v7\",\n        \"version\": \"v7.3.1\",\n        \"sum\": \"h1:bil1IjnHdyWDASFYKfwdRiNtFP6WK3osW7QFEAgU4I8=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/ics23/go\",\n        \"version\": \"v0.10.0\",\n        \"sum\": \"h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM=\"\n      },\n      {\n        \"path\": \"github.com/cosmos/rosetta-sdk-go\",\n        \"version\": \"v0.10.0\",\n        \"sum\": \"h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM=\"\n      },\n      {\n        \"path\": \"github.com/cpuguy83/go-md2man/v2\",\n        \"version\": \"v2.0.2\",\n        \"sum\": \"h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=\"\n      },\n      {\n        \"path\": \"github.com/creachadair/taskgroup\",\n        \"version\": \"v0.4.2\",\n        \"sum\": \"h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8=\"\n      },\n      {\n        \"path\": \"github.com/davecgh/go-spew\",\n        \"version\": \"v1.1.1\",\n        \"sum\": \"h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\"\n      },\n      {\n        \"path\": \"github.com/deckarep/golang-set\",\n        \"version\": \"v1.8.0\",\n        \"sum\": \"h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=\"\n      },\n      {\n        \"path\": \"github.com/decred/dcrd/dcrec/secp256k1/v4\",\n        \"version\": \"v4.1.0\",\n        \"sum\": \"h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4=\"\n      },\n      {\n        \"path\": \"github.com/desertbit/timer\",\n        \"version\": \"v0.0.0-20180107155436-c41aec40b27f\",\n        \"sum\": \"h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I=\"\n      },\n      {\n        \"path\": \"github.com/dlclark/regexp2\",\n        \"version\": \"v1.4.1-0.20201116162257-a2a8dda75c91\",\n        \"sum\": \"h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E=\"\n      },\n      {\n        \"path\": \"github.com/dop251/goja\",\n        \"version\": \"v0.0.0-20220405120441-9037c2b61cbf\",\n        \"sum\": \"h1:Yt+4K30SdjOkRoRRm3vYNQgR+/ZIy0RmeUDZo7Y8zeQ=\"\n      },\n      {\n        \"path\": \"github.com/dvsekhvalnov/jose2go\",\n        \"version\": \"v1.5.0\",\n        \"sum\": \"h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM=\"\n      },\n      {\n        \"path\": \"github.com/edsrzf/mmap-go\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=\"\n      },\n      {\n        \"path\": \"github.com/ethereum/go-ethereum\",\n        \"version\": \"v1.10.26\",\n        \"sum\": \"h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s=\"\n      },\n      {\n        \"path\": \"github.com/felixge/httpsnoop\",\n        \"version\": \"v1.0.2\",\n        \"sum\": \"h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=\"\n      },\n      {\n        \"path\": \"github.com/fjl/memsize\",\n        \"version\": \"v0.0.0-20190710130421-bcb5799ab5e5\",\n        \"sum\": \"h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=\"\n      },\n      {\n        \"path\": \"github.com/fsnotify/fsnotify\",\n        \"version\": \"v1.6.0\",\n        \"sum\": \"h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\"\n      },\n      {\n        \"path\": \"github.com/getsentry/sentry-go\",\n        \"version\": \"v0.23.0\",\n        \"sum\": \"h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE=\"\n      },\n      {\n        \"path\": \"github.com/go-kit/kit\",\n        \"version\": \"v0.12.0\",\n        \"sum\": \"h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4=\"\n      },\n      {\n        \"path\": \"github.com/go-kit/log\",\n        \"version\": \"v0.2.1\",\n        \"sum\": \"h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=\"\n      },\n      {\n        \"path\": \"github.com/go-logfmt/logfmt\",\n        \"version\": \"v0.6.0\",\n        \"sum\": \"h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=\"\n      },\n      {\n        \"path\": \"github.com/go-sourcemap/sourcemap\",\n        \"version\": \"v2.1.3+incompatible\",\n        \"sum\": \"h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=\"\n      },\n      {\n        \"path\": \"github.com/go-stack/stack\",\n        \"version\": \"v1.8.0\",\n        \"sum\": \"h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=\"\n      },\n      {\n        \"path\": \"github.com/godbus/dbus\",\n        \"version\": \"v0.0.0-20190726142602-4481cbc300e2\",\n        \"sum\": \"h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=\"\n      },\n      {\n        \"path\": \"github.com/gogo/googleapis\",\n        \"version\": \"v1.4.1\",\n        \"sum\": \"h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=\"\n      },\n      {\n        \"path\": \"github.com/gogo/protobuf\",\n        \"version\": \"v1.3.2\",\n        \"sum\": \"h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\"\n      },\n      {\n        \"path\": \"github.com/golang-jwt/jwt/v4\",\n        \"version\": \"v4.3.0\",\n        \"sum\": \"h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=\"\n      },\n      {\n        \"path\": \"github.com/golang/groupcache\",\n        \"version\": \"v0.0.0-20210331224755-41bb18bfe9da\",\n        \"sum\": \"h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\"\n      },\n      {\n        \"path\": \"github.com/golang/mock\",\n        \"version\": \"v1.6.0\",\n        \"sum\": \"h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\"\n      },\n      {\n        \"path\": \"github.com/golang/protobuf\",\n        \"version\": \"v1.5.3\",\n        \"sum\": \"h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\"\n      },\n      {\n        \"path\": \"github.com/golang/snappy\",\n        \"version\": \"v0.0.4\",\n        \"sum\": \"h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=\"\n      },\n      {\n        \"path\": \"github.com/google/btree\",\n        \"version\": \"v1.1.2\",\n        \"sum\": \"h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=\"\n      },\n      {\n        \"path\": \"github.com/google/go-cmp\",\n        \"version\": \"v0.5.9\",\n        \"sum\": \"h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\"\n      },\n      {\n        \"path\": \"github.com/google/orderedcode\",\n        \"version\": \"v0.0.1\",\n        \"sum\": \"h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us=\"\n      },\n      {\n        \"path\": \"github.com/google/s2a-go\",\n        \"version\": \"v0.1.4\",\n        \"sum\": \"h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc=\"\n      },\n      {\n        \"path\": \"github.com/google/uuid\",\n        \"version\": \"v1.3.0\",\n        \"sum\": \"h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\"\n      },\n      {\n        \"path\": \"github.com/googleapis/enterprise-certificate-proxy\",\n        \"version\": \"v0.2.4\",\n        \"sum\": \"h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4=\"\n      },\n      {\n        \"path\": \"github.com/googleapis/gax-go/v2\",\n        \"version\": \"v2.12.0\",\n        \"sum\": \"h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=\"\n      },\n      {\n        \"path\": \"github.com/gorilla/handlers\",\n        \"version\": \"v1.5.1\",\n        \"sum\": \"h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=\"\n      },\n      {\n        \"path\": \"github.com/gorilla/mux\",\n        \"version\": \"v1.8.0\",\n        \"sum\": \"h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\"\n      },\n      {\n        \"path\": \"github.com/gorilla/websocket\",\n        \"version\": \"v1.5.0\",\n        \"sum\": \"h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=\"\n      },\n      {\n        \"path\": \"github.com/grpc-ecosystem/go-grpc-middleware\",\n        \"version\": \"v1.3.0\",\n        \"sum\": \"h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=\"\n      },\n      {\n        \"path\": \"github.com/grpc-ecosystem/grpc-gateway\",\n        \"version\": \"v1.16.0\",\n        \"sum\": \"h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=\"\n      },\n      {\n        \"path\": \"github.com/gsterjov/go-libsecret\",\n        \"version\": \"v0.0.0-20161001094733-a6f4afe4910c\",\n        \"sum\": \"h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=\"\n      },\n      {\n        \"path\": \"github.com/gtank/merlin\",\n        \"version\": \"v0.1.1\",\n        \"sum\": \"h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=\"\n      },\n      {\n        \"path\": \"github.com/gtank/ristretto255\",\n        \"version\": \"v0.1.2\",\n        \"sum\": \"h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/go-bexpr\",\n        \"version\": \"v0.1.10\",\n        \"sum\": \"h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/go-cleanhttp\",\n        \"version\": \"v0.5.2\",\n        \"sum\": \"h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/go-getter\",\n        \"version\": \"v1.7.1\",\n        \"sum\": \"h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/go-immutable-radix\",\n        \"version\": \"v1.3.1\",\n        \"sum\": \"h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/go-safetemp\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/go-version\",\n        \"version\": \"v1.6.0\",\n        \"sum\": \"h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/golang-lru\",\n        \"version\": \"v0.5.5-0.20210104140557-80c98217689d\",\n        \"sum\": \"h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=\"\n      },\n      {\n        \"path\": \"github.com/hashicorp/hcl\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\"\n      },\n      {\n        \"path\": \"github.com/hdevalence/ed25519consensus\",\n        \"version\": \"v0.1.0\",\n        \"sum\": \"h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU=\"\n      },\n      {\n        \"path\": \"github.com/holiman/bloomfilter/v2\",\n        \"version\": \"v2.0.3\",\n        \"sum\": \"h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=\"\n      },\n      {\n        \"path\": \"github.com/holiman/uint256\",\n        \"version\": \"v1.2.0\",\n        \"sum\": \"h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM=\"\n      },\n      {\n        \"path\": \"github.com/huandu/skiplist\",\n        \"version\": \"v1.2.0\",\n        \"sum\": \"h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw=\"\n      },\n      {\n        \"path\": \"github.com/huin/goupnp\",\n        \"version\": \"v1.0.3\",\n        \"sum\": \"h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ=\"\n      },\n      {\n        \"path\": \"github.com/improbable-eng/grpc-web\",\n        \"version\": \"v0.15.0\",\n        \"sum\": \"h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ=\"\n      },\n      {\n        \"path\": \"github.com/ipfs/go-cid\",\n        \"version\": \"v0.1.0\",\n        \"sum\": \"h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0=\"\n      },\n      {\n        \"path\": \"github.com/jackpal/go-nat-pmp\",\n        \"version\": \"v1.0.2\",\n        \"sum\": \"h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=\"\n      },\n      {\n        \"path\": \"github.com/jmespath/go-jmespath\",\n        \"version\": \"v0.4.0\",\n        \"sum\": \"h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\"\n      },\n      {\n        \"path\": \"github.com/kelindar/bitmap\",\n        \"version\": \"v1.4.1\",\n        \"sum\": \"h1:Ih0BWMYXkkZxPMU536DsQKRhdvqFl7tuNjImfLJWC6E=\"\n      },\n      {\n        \"path\": \"github.com/kelindar/simd\",\n        \"version\": \"v1.1.2\",\n        \"sum\": \"h1:KduKb+M9cMY2HIH8S/cdJyD+5n5EGgq+Aeeleos55To=\"\n      },\n      {\n        \"path\": \"github.com/klauspost/compress\",\n        \"version\": \"v1.16.3\",\n        \"sum\": \"h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY=\"\n      },\n      {\n        \"path\": \"github.com/klauspost/cpuid/v2\",\n        \"version\": \"v2.2.4\",\n        \"sum\": \"h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\"\n      },\n      {\n        \"path\": \"github.com/kr/pretty\",\n        \"version\": \"v0.3.1\",\n        \"sum\": \"h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\"\n      },\n      {\n        \"path\": \"github.com/kr/text\",\n        \"version\": \"v0.2.0\",\n        \"sum\": \"h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\"\n      },\n      {\n        \"path\": \"github.com/lib/pq\",\n        \"version\": \"v1.10.7\",\n        \"sum\": \"h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=\"\n      },\n      {\n        \"path\": \"github.com/libp2p/go-buffer-pool\",\n        \"version\": \"v0.1.0\",\n        \"sum\": \"h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=\"\n      },\n      {\n        \"path\": \"github.com/magiconair/properties\",\n        \"version\": \"v1.8.7\",\n        \"sum\": \"h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=\"\n      },\n      {\n        \"path\": \"github.com/manifoldco/promptui\",\n        \"version\": \"v0.9.0\",\n        \"sum\": \"h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=\"\n      },\n      {\n        \"path\": \"github.com/mattn/go-colorable\",\n        \"version\": \"v0.1.13\",\n        \"sum\": \"h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\"\n      },\n      {\n        \"path\": \"github.com/mattn/go-isatty\",\n        \"version\": \"v0.0.19\",\n        \"sum\": \"h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=\"\n      },\n      {\n        \"path\": \"github.com/mattn/go-runewidth\",\n        \"version\": \"v0.0.9\",\n        \"sum\": \"h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=\"\n      },\n      {\n        \"path\": \"github.com/matttproud/golang_protobuf_extensions\",\n        \"version\": \"v1.0.4\",\n        \"sum\": \"h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=\"\n      },\n      {\n        \"path\": \"github.com/mimoo/StrobeGo\",\n        \"version\": \"v0.0.0-20210601165009-122bf33a46e0\",\n        \"sum\": \"h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94=\"\n      },\n      {\n        \"path\": \"github.com/minio/blake2b-simd\",\n        \"version\": \"v0.0.0-20160723061019-3f5f724cb5b1\",\n        \"sum\": \"h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=\"\n      },\n      {\n        \"path\": \"github.com/minio/highwayhash\",\n        \"version\": \"v1.0.2\",\n        \"sum\": \"h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=\"\n      },\n      {\n        \"path\": \"github.com/minio/sha256-simd\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=\"\n      },\n      {\n        \"path\": \"github.com/mitchellh/go-homedir\",\n        \"version\": \"v1.1.0\",\n        \"sum\": \"h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\"\n      },\n      {\n        \"path\": \"github.com/mitchellh/go-testing-interface\",\n        \"version\": \"v1.14.1\",\n        \"sum\": \"h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=\"\n      },\n      {\n        \"path\": \"github.com/mitchellh/mapstructure\",\n        \"version\": \"v1.5.0\",\n        \"sum\": \"h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\"\n      },\n      {\n        \"path\": \"github.com/mitchellh/pointerstructure\",\n        \"version\": \"v1.2.0\",\n        \"sum\": \"h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=\"\n      },\n      {\n        \"path\": \"github.com/mr-tron/base58\",\n        \"version\": \"v1.2.0\",\n        \"sum\": \"h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=\"\n      },\n      {\n        \"path\": \"github.com/mtibben/percent\",\n        \"version\": \"v0.2.1\",\n        \"sum\": \"h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs=\"\n      },\n      {\n        \"path\": \"github.com/multiformats/go-base32\",\n        \"version\": \"v0.0.3\",\n        \"sum\": \"h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=\"\n      },\n      {\n        \"path\": \"github.com/multiformats/go-base36\",\n        \"version\": \"v0.1.0\",\n        \"sum\": \"h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=\"\n      },\n      {\n        \"path\": \"github.com/multiformats/go-multibase\",\n        \"version\": \"v0.0.3\",\n        \"sum\": \"h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk=\"\n      },\n      {\n        \"path\": \"github.com/multiformats/go-multihash\",\n        \"version\": \"v0.0.15\",\n        \"sum\": \"h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM=\"\n      },\n      {\n        \"path\": \"github.com/multiformats/go-varint\",\n        \"version\": \"v0.0.6\",\n        \"sum\": \"h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=\"\n      },\n      {\n        \"path\": \"github.com/olekukonko/tablewriter\",\n        \"version\": \"v0.0.5\",\n        \"sum\": \"h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=\"\n      },\n      {\n        \"path\": \"github.com/pelletier/go-toml/v2\",\n        \"version\": \"v2.0.8\",\n        \"sum\": \"h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=\"\n      },\n      {\n        \"path\": \"github.com/pkg/errors\",\n        \"version\": \"v0.9.1\",\n        \"sum\": \"h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\"\n      },\n      {\n        \"path\": \"github.com/pmezard/go-difflib\",\n        \"version\": \"v1.0.0\",\n        \"sum\": \"h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\"\n      },\n      {\n        \"path\": \"github.com/prometheus/client_golang\",\n        \"version\": \"v1.17.0\",\n        \"sum\": \"h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=\"\n      },\n      {\n        \"path\": \"github.com/prometheus/client_model\",\n        \"version\": \"v0.4.1-0.20230718164431-9a2bf3000d16\",\n        \"sum\": \"h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=\"\n      },\n      {\n        \"path\": \"github.com/prometheus/common\",\n        \"version\": \"v0.44.0\",\n        \"sum\": \"h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=\"\n      },\n      {\n        \"path\": \"github.com/prometheus/procfs\",\n        \"version\": \"v0.11.1\",\n        \"sum\": \"h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=\"\n      },\n      {\n        \"path\": \"github.com/prometheus/tsdb\",\n        \"version\": \"v0.7.1\",\n        \"sum\": \"h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=\"\n      },\n      {\n        \"path\": \"github.com/rakyll/statik\",\n        \"version\": \"v0.1.7\",\n        \"sum\": \"h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ=\"\n      },\n      {\n        \"path\": \"github.com/rcrowley/go-metrics\",\n        \"version\": \"v0.0.0-20201227073835-cf1acfcdf475\",\n        \"sum\": \"h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=\"\n      },\n      {\n        \"path\": \"github.com/rjeczalik/notify\",\n        \"version\": \"v0.9.1\",\n        \"sum\": \"h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=\"\n      },\n      {\n        \"path\": \"github.com/rogpeppe/go-internal\",\n        \"version\": \"v1.11.0\",\n        \"sum\": \"h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=\"\n      },\n      {\n        \"path\": \"github.com/rs/cors\",\n        \"version\": \"v1.8.3\",\n        \"sum\": \"h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo=\"\n      },\n      {\n        \"path\": \"github.com/rs/zerolog\",\n        \"version\": \"v1.30.0\",\n        \"sum\": \"h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=\"\n      },\n      {\n        \"path\": \"github.com/russross/blackfriday/v2\",\n        \"version\": \"v2.1.0\",\n        \"sum\": \"h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=\"\n      },\n      {\n        \"path\": \"github.com/shirou/gopsutil\",\n        \"version\": \"v3.21.4-0.20210419000835-c7a38de76ee5+incompatible\",\n        \"sum\": \"h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=\"\n      },\n      {\n        \"path\": \"github.com/spf13/afero\",\n        \"version\": \"v1.9.5\",\n        \"sum\": \"h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=\"\n      },\n      {\n        \"path\": \"github.com/spf13/cast\",\n        \"version\": \"v1.5.1\",\n        \"sum\": \"h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=\"\n      },\n      {\n        \"path\": \"github.com/spf13/cobra\",\n        \"version\": \"v1.7.0\",\n        \"sum\": \"h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=\"\n      },\n      {\n        \"path\": \"github.com/spf13/jwalterweatherman\",\n        \"version\": \"v1.1.0\",\n        \"sum\": \"h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=\"\n      },\n      {\n        \"path\": \"github.com/spf13/pflag\",\n        \"version\": \"v1.0.5\",\n        \"sum\": \"h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\"\n      },\n      {\n        \"path\": \"github.com/spf13/viper\",\n        \"version\": \"v1.16.0\",\n        \"sum\": \"h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc=\"\n      },\n      {\n        \"path\": \"github.com/stratosnet/stratos-chain/api\",\n        \"version\": \"v0.0.0-20231220214043-682f174b1c21\",\n        \"sum\": \"h1:aVfwtoQ4dCAXbzfQ9k4rLKkT4UAeWudH8OxNb3WXQm8=\"\n      },\n      {\n        \"path\": \"github.com/stretchr/testify\",\n        \"version\": \"v1.8.4\",\n        \"sum\": \"h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\"\n      },\n      {\n        \"path\": \"github.com/subosito/gotenv\",\n        \"version\": \"v1.4.2\",\n        \"sum\": \"h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=\"\n      },\n      {\n        \"path\": \"github.com/syndtr/goleveldb\",\n        \"version\": \"v1.0.1-0.20220721030215-126854af5e6d\",\n        \"sum\": \"\"\n      },\n      {\n        \"path\": \"github.com/tendermint/go-amino\",\n        \"version\": \"v0.16.0\",\n        \"sum\": \"h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=\"\n      },\n      {\n        \"path\": \"github.com/tidwall/btree\",\n        \"version\": \"v1.6.0\",\n        \"sum\": \"h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg=\"\n      },\n      {\n        \"path\": \"github.com/tklauser/go-sysconf\",\n        \"version\": \"v0.3.11\",\n        \"sum\": \"h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=\"\n      },\n      {\n        \"path\": \"github.com/tklauser/numcpus\",\n        \"version\": \"v0.6.0\",\n        \"sum\": \"h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=\"\n      },\n      {\n        \"path\": \"github.com/tyler-smith/go-bip39\",\n        \"version\": \"v1.1.0\",\n        \"sum\": \"h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=\"\n      },\n      {\n        \"path\": \"github.com/ulikunitz/xz\",\n        \"version\": \"v0.5.11\",\n        \"sum\": \"h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=\"\n      },\n      {\n        \"path\": \"github.com/urfave/cli/v2\",\n        \"version\": \"v2.10.2\",\n        \"sum\": \"h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y=\"\n      },\n      {\n        \"path\": \"github.com/xrash/smetrics\",\n        \"version\": \"v0.0.0-20201216005158-039620a65673\",\n        \"sum\": \"h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=\"\n      },\n      {\n        \"path\": \"go.opencensus.io\",\n        \"version\": \"v0.24.0\",\n        \"sum\": \"h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=\"\n      },\n      {\n        \"path\": \"golang.org/x/crypto\",\n        \"version\": \"v0.12.0\",\n        \"sum\": \"h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=\"\n      },\n      {\n        \"path\": \"golang.org/x/exp\",\n        \"version\": \"v0.0.0-20230711153332-06a737ee72cb\",\n        \"sum\": \"h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us=\"\n      },\n      {\n        \"path\": \"golang.org/x/net\",\n        \"version\": \"v0.14.0\",\n        \"sum\": \"h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=\"\n      },\n      {\n        \"path\": \"golang.org/x/oauth2\",\n        \"version\": \"v0.10.0\",\n        \"sum\": \"h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=\"\n      },\n      {\n        \"path\": \"golang.org/x/sync\",\n        \"version\": \"v0.3.0\",\n        \"sum\": \"h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=\"\n      },\n      {\n        \"path\": \"golang.org/x/sys\",\n        \"version\": \"v0.11.0\",\n        \"sum\": \"h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=\"\n      },\n      {\n        \"path\": \"golang.org/x/term\",\n        \"version\": \"v0.11.0\",\n        \"sum\": \"h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=\"\n      },\n      {\n        \"path\": \"golang.org/x/text\",\n        \"version\": \"v0.12.0\",\n        \"sum\": \"h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=\"\n      },\n      {\n        \"path\": \"golang.org/x/xerrors\",\n        \"version\": \"v0.0.0-20220907171357-04be3eba64a2\",\n        \"sum\": \"h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=\"\n      },\n      {\n        \"path\": \"google.golang.org/api\",\n        \"version\": \"v0.128.0\",\n        \"sum\": \"h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg=\"\n      },\n      {\n        \"path\": \"google.golang.org/appengine\",\n        \"version\": \"v1.6.7\",\n        \"sum\": \"h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\"\n      },\n      {\n        \"path\": \"google.golang.org/genproto\",\n        \"version\": \"v0.0.0-20230920204549-e6e6cdab5c13\",\n        \"sum\": \"h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0=\"\n      },\n      {\n        \"path\": \"google.golang.org/genproto/googleapis/api\",\n        \"version\": \"v0.0.0-20231002182017-d307bd883b97\",\n        \"sum\": \"h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU=\"\n      },\n      {\n        \"path\": \"google.golang.org/genproto/googleapis/rpc\",\n        \"version\": \"v0.0.0-20230920204549-e6e6cdab5c13\",\n        \"sum\": \"h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM=\"\n      },\n      {\n        \"path\": \"google.golang.org/grpc\",\n        \"version\": \"v1.58.3\",\n        \"sum\": \"h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ=\"\n      },\n      {\n        \"path\": \"google.golang.org/protobuf\",\n        \"version\": \"v1.31.0\",\n        \"sum\": \"h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=\"\n      },\n      {\n        \"path\": \"gopkg.in/ini.v1\",\n        \"version\": \"v1.67.0\",\n        \"sum\": \"h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\"\n      },\n      {\n        \"path\": \"gopkg.in/yaml.v2\",\n        \"version\": \"v2.4.0\",\n        \"sum\": \"h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\"\n      },\n      {\n        \"path\": \"gopkg.in/yaml.v3\",\n        \"version\": \"v3.0.1\",\n        \"sum\": \"h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\"\n      },\n      {\n        \"path\": \"nhooyr.io/websocket\",\n        \"version\": \"v1.8.6\",\n        \"sum\": \"h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k=\"\n      },\n      {\n        \"path\": \"pgregory.net/rapid\",\n        \"version\": \"v0.5.5\",\n        \"sum\": \"h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA=\"\n      },\n      {\n        \"path\": \"sigs.k8s.io/yaml\",\n        \"version\": \"v1.3.0\",\n        \"sum\": \"h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\"\n      }\n    ],\n    \"cosmos_sdk_version\": \"v0.47.5\"\n  }\n}\n
GET /cosmos/base/tendermint/v1beta1/syncing \u00a0\u00a0\u00a0\u00a0\u00a0 queries node syncing. Request Example:
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/syncing\n
Response Example:
{\n  \"syncing\": false\n}\n
GET /cosmos/base/tendermint/v1beta1/validatorsets/latest \u00a0\u00a0\u00a0\u00a0\u00a0 queries latest validator-set. Request Example:
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/validatorsets/latest\n
Response Example:
{\n  \"block_height\": \"927\",\n  \"validators\": [\n    {\n      \"address\": \"stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\",\n      \"pub_key\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n      },\n      \"voting_power\": \"504000000000000\",\n      \"proposer_priority\": \"0\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
GET /cosmos/base/tendermint/v1beta1/validatorsets/{height} \u00a0\u00a0\u00a0\u00a0\u00a0 queries validator-set at a given height. Request Example:
https://rest.thestratos.org/cosmos/base/tendermint/v1beta1/validatorsets/800\n
Response Example:
{\n  \"block_height\": \"800\",\n  \"validators\": [\n    {\n      \"address\": \"stvalcons1qk2flmcrpyyxs6ekq7wgh62caeqjmp6ymddlvp\",\n      \"pub_key\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"yaG6YrluzJfxOgwFuRhlgpOvQAmzBS7kqMVvISN8XWs=\"\n      },\n      \"voting_power\": \"504000000000000\",\n      \"proposer_priority\": \"0\"\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"1\"\n  }\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#transactions","title":"Transactions","text":"

Search, encode, or broadcast transactions.

GET /cosmos/tx/v1beta1/txs \u00a0\u00a0\u00a0\u00a0\u00a0 fetches txs by event. Request Example:
https://rest.thestratos.org/cosmos/tx/v1beta1/txs?events=tx.height=557\n
Response Example:
{\n  \"txs\": [\n    {\n      \"body\": {\n        \"messages\": [\n          {\n            \"@type\": \"/cosmos.bank.v1beta1.MsgSend\",\n            \"from_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"to_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n            \"amount\": [\n              {\n                \"denom\": \"wei\",\n                \"amount\": \"10000000000000000000\"\n              }\n            ]\n          }\n        ],\n        \"memo\": \"\",\n        \"timeout_height\": \"0\",\n        \"extension_options\": [],\n        \"non_critical_extension_options\": []\n      },\n      \"auth_info\": {\n        \"signer_infos\": [\n          {\n            \"public_key\": {\n              \"@type\": \"/stratos.crypto.v1.ethsecp256k1.PubKey\",\n              \"key\": \"A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr\"\n            },\n            \"mode_info\": {\n              \"single\": {\n                \"mode\": \"SIGN_MODE_DIRECT\"\n              }\n            },\n            \"sequence\": \"4\"\n          }\n        ],\n        \"fee\": {\n          \"amount\": [\n            {\n              \"denom\": \"wei\",\n              \"amount\": \"442524000000000\"\n            }\n          ],\n          \"gas_limit\": \"442524\",\n          \"payer\": \"\",\n          \"granter\": \"\"\n        },\n        \"tip\": null\n      },\n      \"signatures\": [\n        \"DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=\"\n      ]\n    }\n  ],\n  \"tx_responses\": [\n    {\n      \"height\": \"557\",\n      \"txhash\": \"34E401829F23098FEA1F7B398CD9842A6010249F7720BAF1916A14077C97B3E7\",\n      \"codespace\": \"\",\n      \"code\": 0,\n      \"data\": \"12260A242F636F736D6F732E62616E6B2E763162657461312E4D736753656E64526573706F6E7365\",\n      \"raw_log\": \"[{\\\"msg_index\\\":0,\\\"events\\\":[{\\\"type\\\":\\\"message\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"action\\\",\\\"value\\\":\\\"/cosmos.bank.v1beta1.MsgSend\\\"},{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"},{\\\"key\\\":\\\"module\\\",\\\"value\\\":\\\"bank\\\"}]},{\\\"type\\\":\\\"coin_spent\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"spender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"},{\\\"key\\\":\\\"amount\\\",\\\"value\\\":\\\"10000000000000000000wei\\\"}]},{\\\"type\\\":\\\"coin_received\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"receiver\\\",\\\"value\\\":\\\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\\\"},{\\\"key\\\":\\\"amount\\\",\\\"value\\\":\\\"10000000000000000000wei\\\"}]},{\\\"type\\\":\\\"transfer\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"recipient\\\",\\\"value\\\":\\\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\\\"},{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"},{\\\"key\\\":\\\"amount\\\",\\\"value\\\":\\\"10000000000000000000wei\\\"}]},{\\\"type\\\":\\\"message\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"}]}]}]\",\n      \"logs\": [\n        {\n          \"msg_index\": 0,\n          \"log\": \"\",\n          \"events\": [\n            {\n              \"type\": \"message\",\n              \"attributes\": [\n                {\n                  \"key\": \"action\",\n                  \"value\": \"/cosmos.bank.v1beta1.MsgSend\"\n                },\n                {\n                  \"key\": \"sender\",\n                  \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n                },\n                {\n                  \"key\": \"module\",\n                  \"value\": \"bank\"\n                }\n              ]\n            },\n            {\n              \"type\": \"coin_spent\",\n              \"attributes\": [\n                {\n                  \"key\": \"spender\",\n                  \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n                },\n                {\n                  \"key\": \"amount\",\n                  \"value\": \"10000000000000000000wei\"\n                }\n              ]\n            },\n            {\n              \"type\": \"coin_received\",\n              \"attributes\": [\n                {\n                  \"key\": \"receiver\",\n                  \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"\n                },\n                {\n                  \"key\": \"amount\",\n                  \"value\": \"10000000000000000000wei\"\n                }\n              ]\n            },\n            {\n              \"type\": \"transfer\",\n              \"attributes\": [\n                {\n                  \"key\": \"recipient\",\n                  \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"\n                },\n                {\n                  \"key\": \"sender\",\n                  \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n                },\n                {\n                  \"key\": \"amount\",\n                  \"value\": \"10000000000000000000wei\"\n                }\n              ]\n            },\n            {\n              \"type\": \"message\",\n              \"attributes\": [\n                {\n                  \"key\": \"sender\",\n                  \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"info\": \"\",\n      \"gas_wanted\": \"442524\",\n      \"gas_used\": \"431655\",\n      \"tx\": {\n        \"@type\": \"/cosmos.tx.v1beta1.Tx\",\n        \"body\": {\n          \"messages\": [\n            {\n              \"@type\": \"/cosmos.bank.v1beta1.MsgSend\",\n              \"from_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"to_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n              \"amount\": [\n                {\n                  \"denom\": \"wei\",\n                  \"amount\": \"10000000000000000000\"\n                }\n              ]\n            }\n          ],\n          \"memo\": \"\",\n          \"timeout_height\": \"0\",\n          \"extension_options\": [],\n          \"non_critical_extension_options\": []\n        },\n        \"auth_info\": {\n          \"signer_infos\": [\n            {\n              \"public_key\": {\n                \"@type\": \"/stratos.crypto.v1.ethsecp256k1.PubKey\",\n                \"key\": \"A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr\"\n              },\n              \"mode_info\": {\n                \"single\": {\n                  \"mode\": \"SIGN_MODE_DIRECT\"\n                }\n              },\n              \"sequence\": \"4\"\n            }\n          ],\n          \"fee\": {\n            \"amount\": [\n              {\n                \"denom\": \"wei\",\n                \"amount\": \"442524000000000\"\n              }\n            ],\n            \"gas_limit\": \"442524\",\n            \"payer\": \"\",\n            \"granter\": \"\"\n          },\n          \"tip\": null\n        },\n        \"signatures\": [\n          \"DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=\"\n        ]\n      },\n      \"timestamp\": \"2024-03-07T22:01:52Z\",\n      \"events\": [\n        {\n          \"type\": \"coin_spent\",\n          \"attributes\": [\n            {\n              \"key\": \"spender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            },\n            {\n              \"key\": \"amount\",\n              \"value\": \"442524000000000wei\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"coin_received\",\n          \"attributes\": [\n            {\n              \"key\": \"receiver\",\n              \"value\": \"st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q\",\n              \"index\": true\n            },\n            {\n              \"key\": \"amount\",\n              \"value\": \"442524000000000wei\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"transfer\",\n          \"attributes\": [\n            {\n              \"key\": \"recipient\",\n              \"value\": \"st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q\",\n              \"index\": true\n            },\n            {\n              \"key\": \"sender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            },\n            {\n              \"key\": \"amount\",\n              \"value\": \"442524000000000wei\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"message\",\n          \"attributes\": [\n            {\n              \"key\": \"sender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"tx\",\n          \"attributes\": [\n            {\n              \"key\": \"fee\",\n              \"value\": \"442524000000000wei\",\n              \"index\": true\n            },\n            {\n              \"key\": \"fee_payer\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"tx\",\n          \"attributes\": [\n            {\n              \"key\": \"acc_seq\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m/4\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"tx\",\n          \"attributes\": [\n            {\n              \"key\": \"signature\",\n              \"value\": \"DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"message\",\n          \"attributes\": [\n            {\n              \"key\": \"action\",\n              \"value\": \"/cosmos.bank.v1beta1.MsgSend\",\n              \"index\": true\n            },\n            {\n              \"key\": \"sender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            },\n            {\n              \"key\": \"module\",\n              \"value\": \"bank\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"coin_spent\",\n          \"attributes\": [\n            {\n              \"key\": \"spender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            },\n            {\n              \"key\": \"amount\",\n              \"value\": \"10000000000000000000wei\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"coin_received\",\n          \"attributes\": [\n            {\n              \"key\": \"receiver\",\n              \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n              \"index\": true\n            },\n            {\n              \"key\": \"amount\",\n              \"value\": \"10000000000000000000wei\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"transfer\",\n          \"attributes\": [\n            {\n              \"key\": \"recipient\",\n              \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n              \"index\": true\n            },\n            {\n              \"key\": \"sender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            },\n            {\n              \"key\": \"amount\",\n              \"value\": \"10000000000000000000wei\",\n              \"index\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"message\",\n          \"attributes\": [\n            {\n              \"key\": \"sender\",\n              \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n              \"index\": true\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"pagination\": null,\n  \"total\": \"1\"\n}\n

GET /cosmos/tx/v1beta1/txs/{hash} \u00a0\u00a0\u00a0\u00a0\u00a0 fetches a tx by hash. Request Example:
https://rest.thestratos.org/cosmos/tx/v1beta1/txs/34E401829F23098FEA1F7B398CD9842A6010249F7720BAF1916A14077C97B3E7\n
Response Example:
{\n  \"tx\": {\n    \"body\": {\n      \"messages\": [\n        {\n          \"@type\": \"/cosmos.bank.v1beta1.MsgSend\",\n          \"from_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n          \"to_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n          \"amount\": [\n            {\n              \"denom\": \"wei\",\n              \"amount\": \"10000000000000000000\"\n            }\n          ]\n        }\n      ],\n      \"memo\": \"\",\n      \"timeout_height\": \"0\",\n      \"extension_options\": [],\n      \"non_critical_extension_options\": []\n    },\n    \"auth_info\": {\n      \"signer_infos\": [\n        {\n          \"public_key\": {\n            \"@type\": \"/stratos.crypto.v1.ethsecp256k1.PubKey\",\n            \"key\": \"A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr\"\n          },\n          \"mode_info\": {\n            \"single\": {\n              \"mode\": \"SIGN_MODE_DIRECT\"\n            }\n          },\n          \"sequence\": \"4\"\n        }\n      ],\n      \"fee\": {\n        \"amount\": [\n          {\n            \"denom\": \"wei\",\n            \"amount\": \"442524000000000\"\n          }\n        ],\n        \"gas_limit\": \"442524\",\n        \"payer\": \"\",\n        \"granter\": \"\"\n      },\n      \"tip\": null\n    },\n    \"signatures\": [\n      \"DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=\"\n    ]\n  },\n  \"tx_response\": {\n    \"height\": \"557\",\n    \"txhash\": \"34E401829F23098FEA1F7B398CD9842A6010249F7720BAF1916A14077C97B3E7\",\n    \"codespace\": \"\",\n    \"code\": 0,\n    \"data\": \"12260A242F636F736D6F732E62616E6B2E763162657461312E4D736753656E64526573706F6E7365\",\n    \"raw_log\": \"[{\\\"msg_index\\\":0,\\\"events\\\":[{\\\"type\\\":\\\"message\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"action\\\",\\\"value\\\":\\\"/cosmos.bank.v1beta1.MsgSend\\\"},{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"},{\\\"key\\\":\\\"module\\\",\\\"value\\\":\\\"bank\\\"}]},{\\\"type\\\":\\\"coin_spent\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"spender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"},{\\\"key\\\":\\\"amount\\\",\\\"value\\\":\\\"10000000000000000000wei\\\"}]},{\\\"type\\\":\\\"coin_received\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"receiver\\\",\\\"value\\\":\\\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\\\"},{\\\"key\\\":\\\"amount\\\",\\\"value\\\":\\\"10000000000000000000wei\\\"}]},{\\\"type\\\":\\\"transfer\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"recipient\\\",\\\"value\\\":\\\"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\\\"},{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"},{\\\"key\\\":\\\"amount\\\",\\\"value\\\":\\\"10000000000000000000wei\\\"}]},{\\\"type\\\":\\\"message\\\",\\\"attributes\\\":[{\\\"key\\\":\\\"sender\\\",\\\"value\\\":\\\"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\\\"}]}]}]\",\n    \"logs\": [\n      {\n        \"msg_index\": 0,\n        \"log\": \"\",\n        \"events\": [\n          {\n            \"type\": \"message\",\n            \"attributes\": [\n              {\n                \"key\": \"action\",\n                \"value\": \"/cosmos.bank.v1beta1.MsgSend\"\n              },\n              {\n                \"key\": \"sender\",\n                \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n              },\n              {\n                \"key\": \"module\",\n                \"value\": \"bank\"\n              }\n            ]\n          },\n          {\n            \"type\": \"coin_spent\",\n            \"attributes\": [\n              {\n                \"key\": \"spender\",\n                \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n              },\n              {\n                \"key\": \"amount\",\n                \"value\": \"10000000000000000000wei\"\n              }\n            ]\n          },\n          {\n            \"type\": \"coin_received\",\n            \"attributes\": [\n              {\n                \"key\": \"receiver\",\n                \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"\n              },\n              {\n                \"key\": \"amount\",\n                \"value\": \"10000000000000000000wei\"\n              }\n            ]\n          },\n          {\n            \"type\": \"transfer\",\n            \"attributes\": [\n              {\n                \"key\": \"recipient\",\n                \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\"\n              },\n              {\n                \"key\": \"sender\",\n                \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n              },\n              {\n                \"key\": \"amount\",\n                \"value\": \"10000000000000000000wei\"\n              }\n            ]\n          },\n          {\n            \"type\": \"message\",\n            \"attributes\": [\n              {\n                \"key\": \"sender\",\n                \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n              }\n            ]\n          }\n        ]\n      }\n    ],\n    \"info\": \"\",\n    \"gas_wanted\": \"442524\",\n    \"gas_used\": \"431655\",\n    \"tx\": {\n      \"@type\": \"/cosmos.tx.v1beta1.Tx\",\n      \"body\": {\n        \"messages\": [\n          {\n            \"@type\": \"/cosmos.bank.v1beta1.MsgSend\",\n            \"from_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"to_address\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n            \"amount\": [\n              {\n                \"denom\": \"wei\",\n                \"amount\": \"10000000000000000000\"\n              }\n            ]\n          }\n        ],\n        \"memo\": \"\",\n        \"timeout_height\": \"0\",\n        \"extension_options\": [],\n        \"non_critical_extension_options\": []\n      },\n      \"auth_info\": {\n        \"signer_infos\": [\n          {\n            \"public_key\": {\n              \"@type\": \"/stratos.crypto.v1.ethsecp256k1.PubKey\",\n              \"key\": \"A0GU+d2Ut1t6dOEF+Ln+ZA9oNdjh8vTHhWb788TOCIUr\"\n            },\n            \"mode_info\": {\n              \"single\": {\n                \"mode\": \"SIGN_MODE_DIRECT\"\n              }\n            },\n            \"sequence\": \"4\"\n          }\n        ],\n        \"fee\": {\n          \"amount\": [\n            {\n              \"denom\": \"wei\",\n              \"amount\": \"442524000000000\"\n            }\n          ],\n          \"gas_limit\": \"442524\",\n          \"payer\": \"\",\n          \"granter\": \"\"\n        },\n        \"tip\": null\n      },\n      \"signatures\": [\n        \"DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=\"\n      ]\n    },\n    \"timestamp\": \"2024-03-07T22:01:52Z\",\n    \"events\": [\n      {\n        \"type\": \"coin_spent\",\n        \"attributes\": [\n          {\n            \"key\": \"spender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          },\n          {\n            \"key\": \"amount\",\n            \"value\": \"442524000000000wei\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"coin_received\",\n        \"attributes\": [\n          {\n            \"key\": \"receiver\",\n            \"value\": \"st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q\",\n            \"index\": true\n          },\n          {\n            \"key\": \"amount\",\n            \"value\": \"442524000000000wei\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"transfer\",\n        \"attributes\": [\n          {\n            \"key\": \"recipient\",\n            \"value\": \"st17xpfvakm2amg962yls6f84z3kell8c5lv5hj2q\",\n            \"index\": true\n          },\n          {\n            \"key\": \"sender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          },\n          {\n            \"key\": \"amount\",\n            \"value\": \"442524000000000wei\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"message\",\n        \"attributes\": [\n          {\n            \"key\": \"sender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"tx\",\n        \"attributes\": [\n          {\n            \"key\": \"fee\",\n            \"value\": \"442524000000000wei\",\n            \"index\": true\n          },\n          {\n            \"key\": \"fee_payer\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"tx\",\n        \"attributes\": [\n          {\n            \"key\": \"acc_seq\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m/4\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"tx\",\n        \"attributes\": [\n          {\n            \"key\": \"signature\",\n            \"value\": \"DOf7A9h7/Ahpu6M2+o8LUGEsI89FJnEb+iL63x6OHqEVgcKiHDkSxEVORhPoO/vnRSygKGhX7KdPlb1nKLOImAE=\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"message\",\n        \"attributes\": [\n          {\n            \"key\": \"action\",\n            \"value\": \"/cosmos.bank.v1beta1.MsgSend\",\n            \"index\": true\n          },\n          {\n            \"key\": \"sender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          },\n          {\n            \"key\": \"module\",\n            \"value\": \"bank\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"coin_spent\",\n        \"attributes\": [\n          {\n            \"key\": \"spender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          },\n          {\n            \"key\": \"amount\",\n            \"value\": \"10000000000000000000wei\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"coin_received\",\n        \"attributes\": [\n          {\n            \"key\": \"receiver\",\n            \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n            \"index\": true\n          },\n          {\n            \"key\": \"amount\",\n            \"value\": \"10000000000000000000wei\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"transfer\",\n        \"attributes\": [\n          {\n            \"key\": \"recipient\",\n            \"value\": \"st19tgvkz4d4uqv68ahn90vc4mhuh63g2l7u4ad6l\",\n            \"index\": true\n          },\n          {\n            \"key\": \"sender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          },\n          {\n            \"key\": \"amount\",\n            \"value\": \"10000000000000000000wei\",\n            \"index\": true\n          }\n        ]\n      },\n      {\n        \"type\": \"message\",\n        \"attributes\": [\n          {\n            \"key\": \"sender\",\n            \"value\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n            \"index\": true\n          }\n        ]\n      }\n    ]\n  }\n}\n

"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#register","title":"Register","text":" GET /stratos/register/v1/resource_node/{nodeAddress} \u00a0\u00a0\u00a0\u00a0\u00a0 queries info of a registered resource node Request Example:
https://rest.thestratos.org/stratos/register/v1/resource_node/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\n
Response Example:
{\n  \"node\": {\n    \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n    \"pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n    },\n    \"suspend\": true,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"1000000000000000000\",\n    \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"description\": {\n      \"moniker\": \"resource-node0\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"2024-03-08T19:18:51.591341919Z\",\n    \"node_type\": 4,\n    \"effective_tokens\": \"0\",\n    \"beneficiary_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n  }\n}\n
GET /stratos/register/v1/meta_node/{nodeAddress} \u00a0\u00a0\u00a0\u00a0\u00a0 returns info of a registered meta node Request Example:
https://rest.thestratos.org/stratos/register/v1/meta_node/stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\n
Response Example:
{\n  \"node\": {\n    \"network_address\": \"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\",\n    \"pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ=\"\n    },\n    \"suspend\": false,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"100000000000000000000\",\n    \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"description\": {\n      \"moniker\": \"snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"0001-01-01T00:00:00Z\",\n    \"beneficiary_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\"\n  }\n}\n
GET /stratos/register/v1/deposit_total \u00a0\u00a0\u00a0\u00a0\u00a0 queries total deposit state of all registered resource nodes and meta nodes Request Example:
https://rest.thestratos.org/stratos/register/v1/deposit_total\n
Response Example:
{\n  \"resource_nodes_total_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"1000000000000000000\"\n  },\n  \"meta_nodes_total_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"400000000000000000000\"\n  },\n  \"total_bonded_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"401000000000000000000\"\n  },\n  \"total_unbonded_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"0\"\n  },\n  \"total_unbonding_deposit\": {\n    \"denom\": \"wei\",\n    \"amount\": \"0\"\n  }\n}\n
GET /stratos/register/v1/deposit_by_node/{network_addr}/{query_type} \u00a0\u00a0\u00a0\u00a0\u00a0 queries deposit info of a specific node Request Example:
+ query_type      query_type defines which type of node to query for, can be one of 0 (all) | 1 (meta-node) | 2 (resource-node).\n
https://rest.thestratos.org/stratos/register/v1/deposit_by_node/stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv/0\n
Response Example:
{\n  \"deposit_info\": {\n    \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n    \"pubkey\": {\n      \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n      \"key\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n    },\n    \"suspend\": true,\n    \"status\": \"BOND_STATUS_BONDED\",\n    \"tokens\": \"1000000000000000000\",\n    \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n    \"description\": {\n      \"moniker\": \"resource-node0\",\n      \"identity\": \"\",\n      \"website\": \"\",\n      \"security_contact\": \"\",\n      \"details\": \"\"\n    },\n    \"creation_time\": \"2024-03-08T19:18:51.591341919Z\",\n    \"node_type\": 4,\n    \"bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"1000000000000000000\"\n    },\n    \"un_bonding_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    },\n    \"un_bonded_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"0\"\n    }\n  }\n}\n
GET /stratos/register/v1/deposit_by_owner/{owner_addr} \u00a0\u00a0\u00a0\u00a0\u00a0 queries all deposit info of a specific owner Request Example:
https://rest.thestratos.org/stratos/register/v1/deposit_by_owner/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\n
Response Example:
{\n  \"deposit_infos\": [\n    {\n      \"network_address\": \"stsds1gl9ywg6jdfdgcja70ffum4ectq4fmt26ay4znv\",\n      \"pubkey\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"2OAeLO0+KrBkSxuFKU1ofJqGb4RtA8GpD8XCZlMYw2A=\"\n      },\n      \"suspend\": true,\n      \"status\": \"BOND_STATUS_BONDED\",\n      \"tokens\": \"1000000000000000000\",\n      \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"description\": {\n        \"moniker\": \"resource-node0\",\n        \"identity\": \"\",\n        \"website\": \"\",\n        \"security_contact\": \"\",\n        \"details\": \"\"\n      },\n      \"creation_time\": \"2024-03-08T19:18:51.591341919Z\",\n      \"node_type\": 4,\n      \"bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"1000000000000000000\"\n      },\n      \"un_bonding_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      },\n      \"un_bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      }\n    },\n    {\n      \"network_address\": \"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\",\n      \"pubkey\": {\n        \"@type\": \"/cosmos.crypto.ed25519.PubKey\",\n        \"key\": \"ltODy8zL5IjJwCutlIexqlBb3GH0+aHZOrpT7f/aKnQ=\"\n      },\n      \"suspend\": false,\n      \"status\": \"BOND_STATUS_BONDED\",\n      \"tokens\": \"100000000000000000000\",\n      \"owner_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"description\": {\n        \"moniker\": \"snode://stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64@127.0.0.1:8888\",\n        \"identity\": \"\",\n        \"website\": \"\",\n        \"security_contact\": \"\",\n        \"details\": \"\"\n      },\n      \"creation_time\": \"0001-01-01T00:00:00Z\",\n      \"node_type\": 0,\n      \"bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"100000000000000000000\"\n      },\n      \"un_bonding_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      },\n      \"un_bonded_deposit\": {\n        \"denom\": \"wei\",\n        \"amount\": \"0\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"2\"\n  }\n}\n
GET /stratos/register/v1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries params of registered module Request Example:
https://rest.thestratos.org/stratos/register/v1/params\n
Response Example:
{\n  \"params\": {\n    \"bond_denom\": \"wei\",\n    \"unbonding_threashold_time\": \"15552000s\",\n    \"unbonding_completion_time\": \"1209600s\",\n    \"max_entries\": 16,\n    \"resource_node_reg_enabled\": true,\n    \"resource_node_min_deposit\": {\n      \"denom\": \"wei\",\n      \"amount\": \"1000000000000000000\"\n    },\n    \"voting_period\": \"604800s\"\n  }\n}\n
GET /stratos/register/v1/resource_node_count \u00a0\u00a0\u00a0\u00a0\u00a0 queries total number of bonded resource nodes Request Example:
https://rest.thestratos.org/stratos/register/v1/resource_node_count\n
Response Example:
{\n  \"number\": \"2\"\n}\n
GET /stratos/register/v1/meta_node_count \u00a0\u00a0\u00a0\u00a0\u00a0 queries total number of bonded meta nodes Request Example:
https://rest.thestratos.org/stratos/register/v1/meta_node_count\n
Response Example:
{\n  \"number\": \"4\"\n}\n
GET /stratos/register/v1/remaining_ozone_limit \u00a0\u00a0\u00a0\u00a0\u00a0 queries remaining ozone limit Request Example:
https://rest.thestratos.org/stratos/register/v1/remaining_ozone_limit\n
Response Example:
{\n  \"ozone_limit\": \"400000000000000\"\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#proof-of-traffic-pot","title":"Proof of Traffic (PoT)","text":" GET /stratos/pot/v1/volume_report/{epoch} \u00a0\u00a0\u00a0\u00a0\u00a0 queries Pot volume report info at a specific epoch Request Example:
https://rest.thestratos.org/stratos/pot/v1/volume_report/1\n
Response Example:
{\n  \"report_info\": {\n    \"epoch\": \"1\",\n    \"reference\": \"100A1FC0B82DD3B0353B59E90388EEA2B73DEECA872955B414EBC99ECD3E3C1F\",\n    \"tx_hash\": \"7F51147DB44185A1A4DC572EC0C69DEA6E9495DDCDF27CD46CA27935D4B93943\",\n    \"reporter\": \"stsds1cw8qhgsxddak8hh8gs7veqmy5ku8f8za6qlq64\"\n  }\n}\n
GET /stratos/pot/v1/rewards/epoch/{epoch} \u00a0\u00a0\u00a0\u00a0\u00a0 queries all rewards info at a specific epoch Request Example:
https://rest.thestratos.org/stratos/pot/v1/rewards/epoch/1?pagination.limit=2\n
Response Example:
{\n  \"rewards\": [\n    {\n      \"wallet_address\": \"st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\",\n      \"reward_from_mining_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"4000000000000000000\"\n        }\n      ],\n      \"reward_from_traffic_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"25740279520266\"\n        }\n      ]\n    },\n    {\n      \"wallet_address\": \"st1k9hfqps9s2tpnfxch2avvevyvtry0zth39gdzc\",\n      \"reward_from_mining_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"4000000000000000000\"\n        }\n      ],\n      \"reward_from_traffic_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"25740279520266\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": \"y0JUWCEwpMwgs3XzfSwlHBHU9Xg=\",\n    \"total\": \"0\"\n  }\n}\n
GET /stratos/pot/v1/rewards/wallet/{wallet_address} \u00a0\u00a0\u00a0\u00a0\u00a0 queries latest Pot rewards by beneficiary address Request Example:
https://rest.thestratos.org/stratos/pot/v1/rewards/wallet/st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\n
Response Example:
{\n  \"rewards\": {\n    \"wallet_address\": \"st1rwnmgk0x2n2wry876dkxq2hhcce8k7kzspppax\",\n    \"mature_total_reward\": [],\n    \"immature_total_reward\": [\n      {\n        \"denom\": \"wei\",\n        \"amount\": \"16000257399827064713\"\n      }\n    ]\n  }\n}\n
GET /stratos/pot/v1/rewards/wallet/{wallet_address}/epoch/{epoch} \u00a0\u00a0\u00a0\u00a0\u00a0 queries Pot rewards info by beneficiary address at a specific epoch Request Example:
https://rest.thestratos.org/stratos/pot/v1/rewards/wallet/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m/epoch/2\n
Response Example:
{\n  \"rewards\": [\n    {\n      \"wallet_address\": \"st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\",\n      \"reward_from_mining_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"52000000000000000000\"\n        }\n      ],\n      \"reward_from_traffic_pool\": [\n        {\n          \"denom\": \"wei\",\n          \"amount\": \"669244695117639\"\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"next_key\": null,\n    \"total\": \"0\"\n  }\n}\n
GET /stratos/pot/v1/slashing/{wallet_address} \u00a0\u00a0\u00a0\u00a0\u00a0 queries owner's Pot slashing info at a specific height Request Example:
https://rest.thestratos.org/stratos/pot/v1/slashing/st1edp9gkppxzjvcg9nwheh6tp9rsgafatckfdl6m\n
Response Example:
{\n  \"slashing\": \"0\"\n}\n
GET /stratos/pot/v1/params \u00a0\u00a0\u00a0\u00a0\u00a0 Query params of POT module Request Example:
https://rest.thestratos.org/stratos/pot/v1/params\n
Response Example:
{\n  \"params\": {\n    \"bond_denom\": \"wei\",\n    \"reward_denom\": \"wei\",\n    \"mature_epoch\": \"2016\",\n    \"mining_reward_params\": [\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"0\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"16819200000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"80000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6000\",\n        \"meta_node_percentage_in_bp\": \"2000\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"16819200000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"25228800000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"40000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6200\",\n        \"meta_node_percentage_in_bp\": \"1800\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"25228800000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"29433600000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"20000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6400\",\n        \"meta_node_percentage_in_bp\": \"1600\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"29433600000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"31536000000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"10000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6600\",\n        \"meta_node_percentage_in_bp\": \"1400\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"31536000000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"32587200000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"5000000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"6800\",\n        \"meta_node_percentage_in_bp\": \"1200\"\n      },\n      {\n        \"total_mined_valve_start\": {\n          \"denom\": \"wei\",\n          \"amount\": \"32587200000000000000000000\"\n        },\n        \"total_mined_valve_end\": {\n          \"denom\": \"wei\",\n          \"amount\": \"40000000000000000000000000\"\n        },\n        \"mining_reward\": {\n          \"denom\": \"wei\",\n          \"amount\": \"2500000000000000000\"\n        },\n        \"block_chain_percentage_in_bp\": \"2000\",\n        \"resource_node_percentage_in_bp\": \"7000\",\n        \"meta_node_percentage_in_bp\": \"1000\"\n      }\n    ],\n    \"community_tax\": \"0.020000000000000000\",\n    \"initial_total_supply\": {\n      \"denom\": \"wei\",\n      \"amount\": \"100000000000000000000000000\"\n    }\n  }\n}\n
GET /stratos/pot/v1/total_mined_token \u00a0\u00a0\u00a0\u00a0\u00a0 queries total mined token Request Example:
https://rest.thestratos.org/stratos/pot/v1/total_mined_token\n
Response Example:
{\n  \"total_mined_token\": {\n    \"denom\": \"wei\",\n    \"amount\": \"320000000000000000000\"\n  }\n}\n
GET /stratos/pot/v1/circulation_supply \u00a0\u00a0\u00a0\u00a0\u00a0 queries circulation supply Request Example:
https://rest.thestratos.org/stratos/pot/v1/circulation_supply\n
Response Example:
{\n  \"circulation_supply\": [\n    {\n      \"denom\": \"wei\",\n      \"amount\": \"59999809005253057695198254\"\n    }\n  ]\n}\n
"},{"location":"docs-stratos-chain/stratos-chain-rest-apis/#sds","title":"SDS","text":" GET /stratos/sds/v1/file_upload/{file_hash} \u00a0\u00a0\u00a0\u00a0\u00a0 query uploaded file info by hash Request Example:
https://rest.thestratos.org/stratos/sds/v1/file_upload/v05j1m5535t62jdqc57r27gjq2nqcf0o1onavkv8\n
Response Example:
{\n  \"file_info\": {\n    \"height\": \"235396\",\n    \"reporters\": \"DwAAAAAAAAA=\",\n    \"uploader\": \"st1f58px9ysn9zsnucqtjejakkr8lezmwggq2k6av\"\n  }\n}\n
GET /stratos/sds/simPrepay/{amtToPrepay} \u00a0\u00a0\u00a0\u00a0\u00a0 queries a simulated prepay result Request Example:
https://rest.thestratos.org/stratos/sds/v1/sim_prepay/1stos\n
Response Example:
{\n  \"noz\": \"949522847536\"\n}\n
GET /stratos/sds/v1/noz_price \u00a0\u00a0\u00a0\u00a0\u00a0 queries current nozPrice Request Example:
https://rest.thestratos.org/stratos/sds/v1/noz_price\n
Response Example:
{\n  \"price\": \"1050598.078251776812024224\"\n}\n
GET /stratos/sds/v1/noz_supply \u00a0\u00a0\u00a0\u00a0\u00a0 queries current nozSupply Request Example:
https://rest.thestratos.org/stratos/sds/v1/noz_supply\n
Response Example:
{\n  \"remaining\": \"390248902439025\",\n  \"total\": \"400000000000000\"\n}\n
GET /stratos/sds/v1/params \u00a0\u00a0\u00a0\u00a0\u00a0 queries params of SDS module Request Example:
https://rest.thestratos.org/stratos/sds/v1/params\n
Response Example:
{\n  \"params\": {\n    \"bond_denom\": \"wei\"\n  }\n}\n
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..338c056 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,163 @@ + + + + https://docs.thestratos.org/ + 2024-06-11 + daily + + + https://docs.thestratos.org/get-started/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-about/about-stratos/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-about/changes/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-about/stratos-token-economy/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-about/stratos-token-metrics/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/available-dapps/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/node-config/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/deploy-smart-contracts/hardhat/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/deploy-smart-contracts/truffle/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/wallets/metamask/configure-on-metamask/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/wallets/metamask/gas-token/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/wallets/metamask/hello/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-evm/wallets/metamask/multiple-accounts/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/ppd-terminal-subcommands/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/rpc-client/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/sds-ipfs-handbook/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/sds-rpc-for-file-operation/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/sds-update-v12/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/sds-video-streaming-handbook/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-resource-node/setup-and-run-a-sds-resource-node/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/how-to-become-a-validator/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/how-to-setup-rest-grpc-full-chain/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/how-to-start-with-state-sync/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/mainnet-bridge/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/mainnet-staking/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/network/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/setup-and-run-a-stratos-chain-full-node/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/stchaind-commands-part-1/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/stchaind-commands-part-2/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/stratos-chain-grpc-queries/ + 2024-06-11 + daily + + + https://docs.thestratos.org/docs-stratos-chain/stratos-chain-rest-apis/ + 2024-06-11 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..a6b9ae4 Binary files /dev/null and b/sitemap.xml.gz differ

Introduction🔗︎