22 Commits

Author SHA1 Message Date
Thomas Silkjær
fbc68e383f Merge pull request #71 from Ekiserrepe/main
Create cronset page
2025-11-17 12:37:35 +01:00
Ekiserrepé
b9a9984f86 Create cronset.mdx 2025-11-17 07:08:07 +01:00
Alloy Networks
9fcb9f235c Merge pull request #70 from Ekiserrepe/main
Update connect.mdx
2025-11-12 18:04:59 +02:00
Ekiserrepé
334cfc3e31 Update connect.mdx 2025-11-12 16:55:51 +01:00
Thomas Silkjær
7eed80c992 Merge pull request #69 from Ekiserrepe/main
Connect Page
2025-11-12 08:38:51 +01:00
Ekiserrepé
1c6308101e Update footer 2025-11-12 08:31:46 +01:00
Ekiserrepé
2e98bf838a Update Footer.astro 2025-11-12 07:07:20 +01:00
Ekiserrepé
7ea930ba51 Merge branch 'main' of https://github.com/Ekiserrepe/xahau-web 2025-11-12 07:07:03 +01:00
Ekiserrepé
2ef17af47d Footer Header links updates 2025-11-12 07:03:26 +01:00
Thomas Silkjær
523252646d Merge branch 'main' into main 2025-11-11 22:31:16 +01:00
Thomas Silkjær
eb63f48e17 Merge pull request #68 from tequdev/improve-formatter
Improve formatter
2025-11-11 22:30:18 +01:00
Ekiserrepé
4e7d741549 Links 2025-11-11 18:03:20 +01:00
Ekiserrepé
d0f908abd5 Merge branch 'main' of https://github.com/Ekiserrepe/xahau-web 2025-11-11 17:27:43 +01:00
Ekiserrepé
268b65ba41 Connect Page 2025-11-11 17:27:40 +01:00
tequ
e4fdce9ae6 Merge branch 'main' into improve-formatter 2025-11-04 22:31:14 +09:00
tequ
818cd021a1 update biome (support astro, css format) 2025-11-04 22:30:25 +09:00
Ekiserrepé
02da2cc50c Contest page (#67)
* Contest page

* Update contest.mdx

* Update text underline link

* Update main.css
2025-11-04 11:23:18 +01:00
Ekiserrepé
38b4a0df32 Update main.css 2025-11-04 11:09:31 +01:00
Ekiserrepé
8469c5dfaf Update text underline link 2025-11-04 10:55:51 +01:00
Ekiserrepé
86650055e1 Update contest.mdx 2025-11-04 09:57:06 +01:00
Ekiserrepé
40a8aaf655 Contest page 2025-11-04 09:33:24 +01:00
J. Scott Branson
575598f42e Expand Infra Docs with Advanced Config Options and Identity Verification via TOML (#62)
* Add TOML and advanced-config webpages to infra section and minor edits to existing sections.

* Update the Infra section of the index page for the docs. Begin adding content to the TOML page.

* Fix header levels (promote L3 -> L2) in many infra docs.

* Add webserver configuration and TOML file contents.

* Document the '[ORGANIZATION]' section for the TOML.

* Finish the identity page & minor updates/revisions on other pages for consistency.

* Add clustering.

* Document memory (rwdb) database.

* Remove erronious file

* Remove section header for 'Ledger Pinning'.

* Spell Xahau correctly :)

Co-authored-by: tequ <git@tequ.dev>

* proofread

Co-authored-by: tequ <git@tequ.dev>

* proofread

Co-authored-by: tequ <git@tequ.dev>

---------

Co-authored-by: tequ <git@tequ.dev>
Co-authored-by: Thomas Silkjær <thomas@inftf.org>
2025-10-21 17:19:16 +02:00
35 changed files with 1620 additions and 667 deletions

View File

@@ -2,7 +2,9 @@
"editor.formatOnSave": true,
"editor.defaultFormatter": "biomejs.biome",
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
"source.fixAll.biome": "explicit"
},
"files.associations": {
"*.css": "tailwindcss"
}
}

View File

@@ -1,12 +1,12 @@
# Intro
# Thank You!
Public contributions to the documentation are welcome. When contributing, please help with consistency and clarity by adhering to the below guidelines.
### Disambiguation
* Strive for brevity and clarity. Avoid jargon and use a professional writing tone.
# Disambiguation
* Strive for brevity and clarity. Avoid jargon and use a professional writing tone. Adhere to standards, such as [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119).
* When referring to the software `xahaud`, use a lowercase "x" and include the 'd'. When referring to the broader `Xahau Network`, capitalize both terms and,if appropriate, subsequently use the capitalized term "the Network". Use the capitalized `Xahau` or the all caps abbreviation `XAH` when referring to the currency.
* Be mindful that this documentation is shared by a global community. Avoid culture-specific jargon or slang.
### Formatting
# Formatting
* Relative and absolute linking are both permitted. When changing the directory structure or renaming individual pages, use grep to ensure all links are updated. Header, footer, index page, navigation bar, and links on other pages all need to be updated manually.
* The use of second person ("you") is permitted.
* Individual webpages may be formatted using Markdown, HTML, CSS, and JavaScript in any combination. To the extent possible, favor style templates and avoid inline CSS.
@@ -15,5 +15,5 @@ Public contributions to the documentation are welcome. When contributing, please
* Use square brackets inside code snippets to offset user specific information, such as file names and paths. For example: `cd [/path/to/xahaud] && ./xahaud server_info`
* Wrap multi-line code examples in three backticks: "```".
### General Guidelines
# General Guidelines
* Include meaningful commit messages.

View File

@@ -284,7 +284,9 @@ export default defineConfig({
'docs/infrastructure/installing-xahaud',
'docs/infrastructure/updating-xahaud',
'docs/infrastructure/enabling-validation',
'docs/infrastructure/identity',
'docs/infrastructure/interacting',
'docs/infrastructure/advanced-configuration',
{
label: 'Building Xahau (Dev)',
collapsed: true,

View File

@@ -1,12 +1,12 @@
{
"$schema": "https://biomejs.dev/schemas/2.0.6/schema.json",
"$schema": "https://biomejs.dev/schemas/2.3.3/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"includes": ["**", "!*/**/*.astro", "!.astro", "!dist"],
"includes": ["**", "!dist"],
"ignoreUnknown": false
},
"formatter": {
@@ -17,7 +17,24 @@
"linter": {
"enabled": true,
"rules": {
"recommended": true
"recommended": true,
"suspicious": {
"noExplicitAny": "info"
},
"complexity": {
"noBannedTypes": "info"
},
"correctness": {
"noUnusedImports": "off"
}
}
},
"html": {
"experimentalFullSupportEnabled": true,
"formatter": {
"enabled": true,
"indentScriptAndStyle": true,
"indentStyle": "space"
}
},
"javascript": {
@@ -26,6 +43,18 @@
"semicolons": "asNeeded"
}
},
"css": {
"parser": {
"tailwindDirectives": true,
"cssModules": true
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"quoteStyle": "single"
}
},
"assist": {
"enabled": true,
"actions": {

72
package-lock.json generated
View File

@@ -26,7 +26,7 @@
"vanilla-cookieconsent": "^3.1.0"
},
"devDependencies": {
"@biomejs/biome": "^2.0.6"
"@biomejs/biome": "^2.3.3"
}
},
"node_modules/@altcha/crypto": {
@@ -485,9 +485,9 @@
}
},
"node_modules/@biomejs/biome": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.6.tgz",
"integrity": "sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.3.tgz",
"integrity": "sha512-zn/P1pRBCpDdhi+VNSMnpczOz9DnqzOA2c48K8xgxjDODvi5O8gs3a2H233rck/5HXpkFj6TmyoqVvxirZUnvg==",
"dev": true,
"license": "MIT OR Apache-2.0",
"bin": {
@@ -501,20 +501,20 @@
"url": "https://opencollective.com/biome"
},
"optionalDependencies": {
"@biomejs/cli-darwin-arm64": "2.0.6",
"@biomejs/cli-darwin-x64": "2.0.6",
"@biomejs/cli-linux-arm64": "2.0.6",
"@biomejs/cli-linux-arm64-musl": "2.0.6",
"@biomejs/cli-linux-x64": "2.0.6",
"@biomejs/cli-linux-x64-musl": "2.0.6",
"@biomejs/cli-win32-arm64": "2.0.6",
"@biomejs/cli-win32-x64": "2.0.6"
"@biomejs/cli-darwin-arm64": "2.3.3",
"@biomejs/cli-darwin-x64": "2.3.3",
"@biomejs/cli-linux-arm64": "2.3.3",
"@biomejs/cli-linux-arm64-musl": "2.3.3",
"@biomejs/cli-linux-x64": "2.3.3",
"@biomejs/cli-linux-x64-musl": "2.3.3",
"@biomejs/cli-win32-arm64": "2.3.3",
"@biomejs/cli-win32-x64": "2.3.3"
}
},
"node_modules/@biomejs/cli-darwin-arm64": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.6.tgz",
"integrity": "sha512-AzdiNNjNzsE6LfqWyBvcL29uWoIuZUkndu+wwlXW13EKcBHbbKjNQEZIJKYDc6IL+p7bmWGx3v9ZtcRyIoIz5A==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.3.tgz",
"integrity": "sha512-5+JtW6RKmjqL9un0UtHV0ezOslAyYBzyl5ZhYiu7GHesX2x8NCDl6tXYrenv9m7e1RLbkO5E5Kh04kseMtz6lw==",
"cpu": [
"arm64"
],
@@ -529,9 +529,9 @@
}
},
"node_modules/@biomejs/cli-darwin-x64": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.6.tgz",
"integrity": "sha512-wJjjP4E7bO4WJmiQaLnsdXMa516dbtC6542qeRkyJg0MqMXP0fvs4gdsHhZ7p9XWTAmGIjZHFKXdsjBvKGIJJQ==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.3.tgz",
"integrity": "sha512-UPmKRalkHicvIpeccuKqq+/gA2HYV8FUnAEDJnqYBlGlycKqe6xrovWqvWTE4TTNpIFf4UQyuaDzLkN6Kz6tbA==",
"cpu": [
"x64"
],
@@ -546,9 +546,9 @@
}
},
"node_modules/@biomejs/cli-linux-arm64": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.6.tgz",
"integrity": "sha512-ZSVf6TYo5rNMUHIW1tww+rs/krol7U5A1Is/yzWyHVZguuB0lBnIodqyFuwCNqG9aJGyk7xIMS8HG0qGUPz0SA==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.3.tgz",
"integrity": "sha512-zeiKwALNB/hax7+LLhCYqhqzlWdTfgE9BGkX2Z8S4VmCYnGFrf2fON/ec6KCos7mra5MDm6fYICsEWN2+HKZhw==",
"cpu": [
"arm64"
],
@@ -563,9 +563,9 @@
}
},
"node_modules/@biomejs/cli-linux-arm64-musl": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.6.tgz",
"integrity": "sha512-CVPEMlin3bW49sBqLBg2x016Pws7eUXA27XYDFlEtponD0luYjg2zQaMJ2nOqlkKG9fqzzkamdYxHdMDc2gZFw==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.3.tgz",
"integrity": "sha512-KhCDMV+V7Yu72v40ssGJTHuv/j0n7JQ6l0s/c+EMcX5zPYLMLr4XpmI+WXhp4Vfkz0T5Xnh5wbrTBI3f2UTpjQ==",
"cpu": [
"arm64"
],
@@ -580,9 +580,9 @@
}
},
"node_modules/@biomejs/cli-linux-x64": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.6.tgz",
"integrity": "sha512-geM1MkHTV1Kh2Cs/Xzot9BOF3WBacihw6bkEmxkz4nSga8B9/hWy5BDiOG3gHDGIBa8WxT0nzsJs2f/hPqQIQw==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.3.tgz",
"integrity": "sha512-05CjPLbvVVU8J6eaO6iSEoA0FXKy2l6ddL+1h/VpiosCmIp3HxRKLOa1hhC1n+D13Z8g9b1DtnglGtM5U3sTag==",
"cpu": [
"x64"
],
@@ -597,9 +597,9 @@
}
},
"node_modules/@biomejs/cli-linux-x64-musl": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.6.tgz",
"integrity": "sha512-mKHE/e954hR/hSnAcJSjkf4xGqZc/53Kh39HVW1EgO5iFi0JutTN07TSjEMg616julRtfSNJi0KNyxvc30Y4rQ==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.3.tgz",
"integrity": "sha512-IyqQ+jYzU5MVy9CK5NV0U+NnUMPUAhYMrB/x4QgL/Dl1MqzBVc61bHeyhLnKM6DSEk73/TQYrk/8/QmVHudLdQ==",
"cpu": [
"x64"
],
@@ -614,9 +614,9 @@
}
},
"node_modules/@biomejs/cli-win32-arm64": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.6.tgz",
"integrity": "sha512-290V4oSFoKaprKE1zkYVsDfAdn0An5DowZ+GIABgjoq1ndhvNxkJcpxPsiYtT7slbVe3xmlT0ncdfOsN7KruzA==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.3.tgz",
"integrity": "sha512-NtlLs3pdFqFAQYZjlEHKOwJEn3GEaz7rtR2oCrzaLT2Xt3Cfd55/VvodQ5V+X+KepLa956QJagckJrNL+DmumQ==",
"cpu": [
"arm64"
],
@@ -631,9 +631,9 @@
}
},
"node_modules/@biomejs/cli-win32-x64": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.6.tgz",
"integrity": "sha512-bfM1Bce0d69Ao7pjTjUS+AWSZ02+5UHdiAP85Th8e9yV5xzw6JrHXbL5YWlcEKQ84FIZMdDc7ncuti1wd2sdbw==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.3.tgz",
"integrity": "sha512-klJKPPQvUk9Rlp0Dd56gQw/+Wt6uUprHdHWtbDC93f3Iv+knA2tLWpcYoOZJgPV+9s+RBmYv0DGy4mUlr20esg==",
"cpu": [
"x64"
],

View File

@@ -7,7 +7,7 @@
"build": "astro build",
"preview": "astro preview",
"check": "biome check --write",
"ci": "biome ci"
"ci": "biome ci --diagnostic-level=warn"
},
"dependencies": {
"@astrojs/mdx": "^4.3.0",
@@ -28,6 +28,6 @@
"vanilla-cookieconsent": "^3.1.0"
},
"devDependencies": {
"@biomejs/biome": "^2.0.6"
"@biomejs/biome": "^2.3.3"
}
}

View File

@@ -1,10 +1,11 @@
---
import 'vanilla-cookieconsent/dist/cookieconsent.css'
import 'vanilla-cookieconsent/dist/cookieconsent.css'
---
<script>
import { run } from 'vanilla-cookieconsent';
import { config } from '../CookieConsentConfig';
run(config);
import { run } from 'vanilla-cookieconsent'
import { config } from '../CookieConsentConfig'
document.body.classList.add('cc--darkmode');
</script>
run(config)
document.body.classList.add('cc--darkmode')
</script>

View File

@@ -1,12 +1,8 @@
---
---
<script is:inline>
document.documentElement.dataset.theme = 'light';
document.documentElement.dataset.theme = 'light'
</script>
<style is:global>
.social-icons::after {
display: none;
}
</style>
</style>

View File

@@ -1,111 +1,110 @@
---
import {
Bars3Icon,
ChevronDownIcon,
XMarkIcon,
} from '@heroicons/react/20/solid'
import {
Bars3Icon,
ChevronDownIcon,
XMarkIcon,
} from '@heroicons/react/20/solid'
---
<starlight-menu-button class="print:hidden">
<button
aria-expanded="false"
aria-label={Astro.locals.t('menuButton.accessibleLabel')}
aria-controls="starlight__sidebar"
class="sl-flex md:sl-hidden"
>
<Bars3Icon name="open" className="open-menu" />
<XMarkIcon name="close" className="close-menu" />
</button>
<button
aria-expanded="false"
aria-label={Astro.locals.t('menuButton.accessibleLabel')}
aria-controls="starlight__sidebar"
class="sl-flex md:sl-hidden"
>
<Bars3Icon name="open" className="open-menu"/>
<XMarkIcon name="close" className="close-menu"/>
</button>
</starlight-menu-button>
<script>
class StarlightMenuButton extends HTMLElement {
btn = this.querySelector('button')!;
class StarlightMenuButton extends HTMLElement {
btn = this.querySelector('button') as HTMLButtonElement
constructor() {
super();
// Toggle `aria-expanded` state when a user clicks the button.
this.btn.addEventListener('click', () => this.toggleExpanded());
constructor() {
super()
// Toggle `aria-expanded` state when a user clicks the button.
this.btn.addEventListener('click', () => this.toggleExpanded())
// Close the menu when a user presses the escape key.
const parentNav = this.closest('nav');
if (parentNav) {
parentNav.addEventListener('keyup', (e) => this.closeOnEscape(e));
}
}
// Close the menu when a user presses the escape key.
const parentNav = this.closest('nav')
if (parentNav) {
parentNav.addEventListener('keyup', (e) => this.closeOnEscape(e))
}
}
setExpanded(expanded: boolean) {
this.setAttribute('aria-expanded', String(expanded));
document.body.toggleAttribute('data-mobile-menu-expanded', expanded);
}
setExpanded(expanded: boolean) {
this.setAttribute('aria-expanded', String(expanded))
document.body.toggleAttribute('data-mobile-menu-expanded', expanded)
}
toggleExpanded() {
this.setExpanded(this.getAttribute('aria-expanded') !== 'true');
}
toggleExpanded() {
this.setExpanded(this.getAttribute('aria-expanded') !== 'true')
}
closeOnEscape(e: KeyboardEvent) {
if (e.code === 'Escape') {
this.setExpanded(false);
this.btn.focus();
}
}
}
closeOnEscape(e: KeyboardEvent) {
if (e.code === 'Escape') {
this.setExpanded(false)
this.btn.focus()
}
}
}
customElements.define('starlight-menu-button', StarlightMenuButton);
customElements.define('starlight-menu-button', StarlightMenuButton)
</script>
<style>
@layer starlight.core {
button {
position: fixed;
bottom: var(--sl-nav-pad-y);
inset-inline-end: var(--sl-nav-pad-x);
z-index: var(--sl-z-index-navbar);
border: 0;
border-radius: 50%;
width: var(--sl-menu-button-size);
height: var(--sl-menu-button-size);
padding: 0.5rem;
background-color: var(--sl-color-white);
color: var(--sl-color-black);
box-shadow: var(--sl-shadow-md);
cursor: pointer;
}
@layer starlight.core {
button {
position: fixed;
bottom: var(--sl-nav-pad-y);
inset-inline-end: var(--sl-nav-pad-x);
z-index: var(--sl-z-index-navbar);
border: 0;
border-radius: 50%;
width: var(--sl-menu-button-size);
height: var(--sl-menu-button-size);
padding: 0.5rem;
background-color: var(--sl-color-white);
color: var(--sl-color-black);
box-shadow: var(--sl-shadow-md);
cursor: pointer;
}
[aria-expanded='true'] button {
background-color: var(--sl-color-gray-2);
box-shadow: none;
}
[aria-expanded='true'] button {
background-color: var(--sl-color-gray-2);
box-shadow: none;
}
[aria-expanded='true'] button .open-menu {
display: none;
}
[aria-expanded='true'] button .open-menu {
display: none;
}
:not([aria-expanded='true']) button .close-menu {
display: none;
}
:not([aria-expanded='true']) button .close-menu {
display: none;
}
:global button {
background-color: var(--sl-color-black);
color: var(--sl-color-white);
}
:global button {
background-color: var(--sl-color-black);
color: var(--sl-color-white);
}
:global [aria-expanded='true'] button {
background-color: var(--sl-color-gray-5);
}
}
:global [aria-expanded='true'] button {
background-color: var(--sl-color-gray-5);
}
}
</style>
<style is:global>
@layer starlight.core {
[data-mobile-menu-expanded] {
overflow: hidden;
}
@layer starlight.core {
[data-mobile-menu-expanded] {
overflow: hidden;
}
@media (min-width: 50rem) {
[data-mobile-menu-expanded] {
overflow: auto;
}
}
}
</style>
@media (min-width: 50rem) {
[data-mobile-menu-expanded] {
overflow: auto;
}
}
}
</style>

View File

@@ -1,55 +1,59 @@
---
import TableOfContents from '@astrojs/starlight/components/TableOfContents.astro'
import TableOfContents from '@astrojs/starlight/components/TableOfContents.astro'
---
{
Astro.locals.starlightRoute.toc && (
<>
<div class="right-sidebar-panel sl-hidden lg:sl-block">
<div class="sl-container">
<TableOfContents />
</div>
</div>
</>
)
Astro.locals.starlightRoute.toc && (
<>
<div class="right-sidebar-panel sl-hidden lg:sl-block">
<div class="sl-container">
<TableOfContents />
</div>
</div>
</>
)
}
<style>
@layer starlight.core {
.right-sidebar-panel {
padding: 1rem var(--sl-sidebar-pad-x);
}
.sl-container {
width: calc(var(--sl-sidebar-width) - 2 * var(--sl-sidebar-pad-x));
}
.right-sidebar-panel :global(h2) {
color: var(--sl-color-white);
font-size: var(--sl-text-h5);
font-weight: 600;
line-height: var(--sl-line-height-headings);
margin-bottom: 0.5rem;
}
.right-sidebar-panel :global(:where(a)) {
display: block;
font-size: var(--sl-text-xs);
text-decoration: none;
color: var(--sl-color-gray-3);
overflow-wrap: anywhere;
}
.right-sidebar-panel :global(:where(a):hover) {
color: var(--sl-color-white);
}
@media (min-width: 72rem) {
.sl-container {
max-width: calc(
(
(
100vw - var(--sl-sidebar-width) - 2 * var(--sl-content-pad-x) - 2 *
var(--sl-sidebar-pad-x)
) * 0.25 /* MAGIC NUMBER 🥲 */
)
);
}
}
}
</style>
@layer starlight.core {
.right-sidebar-panel {
padding: 1rem var(--sl-sidebar-pad-x);
}
.sl-container {
width: calc(var(--sl-sidebar-width) - 2 * var(--sl-sidebar-pad-x));
}
.right-sidebar-panel :global(h2) {
color: var(--sl-color-white);
font-size: var(--sl-text-h5);
font-weight: 600;
line-height: var(--sl-line-height-headings);
margin-bottom: 0.5rem;
}
.right-sidebar-panel :global(:where(a)) {
display: block;
font-size: var(--sl-text-xs);
text-decoration: none;
color: var(--sl-color-gray-3);
overflow-wrap: anywhere;
}
.right-sidebar-panel :global(:where(a):hover) {
color: var(--sl-color-white);
}
@media (min-width: 72rem) {
.sl-container {
max-width: calc(
(
(
100vw -
var(--sl-sidebar-width) -
2 *
var(--sl-content-pad-x) -
2 *
var(--sl-sidebar-pad-x)
) *
0.25 /* MAGIC NUMBER 🥲 */
)
);
}
}
}
</style>

View File

@@ -1,12 +1,11 @@
---
import SidebarPersister from '@astrojs/starlight/components/SidebarPersister.astro'
import SidebarSublist from '@astrojs/starlight/components/SidebarSublist.astro'
import Search from '@astrojs/starlight/components/Search.astro'
import Search from '@astrojs/starlight/components/Search.astro'
import SidebarPersister from '@astrojs/starlight/components/SidebarPersister.astro'
import SidebarSublist from '@astrojs/starlight/components/SidebarSublist.astro'
const { sidebar } = Astro.locals.starlightRoute
const _sidebar = Astro.locals.starlightRoute.sidebar
---
<SidebarPersister>
<Search class="hidden md:block" />
<SidebarSublist sublist={sidebar} />
</SidebarPersister>
<Search class="hidden md:block"/>
<SidebarSublist sublist={_sidebar}/>
</SidebarPersister>

View File

@@ -1,48 +1,54 @@
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
<div class="col-span-3"><slot /></div>
{
Astro.locals.starlightRoute.toc && (
<aside class="right-sidebar-container col-span-1 print:hidden">
<div class="right-sidebar">
<slot name="right-sidebar" />
</div>
</aside>
)
}
<div class="col-span-3">
<slot/>
</div>
{
Astro.locals.starlightRoute.toc && (
<aside class="right-sidebar-container col-span-1 print:hidden">
<div class="right-sidebar">
<slot name="right-sidebar" />
</div>
</aside>
)
}
</div>
<style>
@layer starlight.core {
@media (min-width: 72rem) {
.right-sidebar-container {
order: 2;
position: relative;
width: calc(
var(--sl-sidebar-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2
);
}
@layer starlight.core {
@media (min-width: 72rem) {
.right-sidebar-container {
order: 2;
position: relative;
width: calc(
var(--sl-sidebar-width) +
(100% - var(--sl-content-width) - var(--sl-sidebar-width)) /
2
);
}
.right-sidebar {
position: fixed;
border-inline-start: 1px solid var(--sl-color-hairline);
width: 100%;
height: 100vh;
overflow-y: auto;
scrollbar-width: none;
}
.right-sidebar {
position: fixed;
border-inline-start: 1px solid var(--sl-color-hairline);
width: 100%;
height: 100vh;
overflow-y: auto;
scrollbar-width: none;
}
.main-pane {
width: 100%;
}
.main-pane {
width: 100%;
}
:global([data-has-sidebar][data-has-toc]) .main-pane {
--sl-content-margin-inline: auto 0;
:global([data-has-sidebar][data-has-toc]) .main-pane {
--sl-content-margin-inline: auto 0;
order: 1;
width: calc(
var(--sl-content-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2
);
}
}
}
</style>
order: 1;
width: calc(
var(--sl-content-width) +
(100% - var(--sl-content-width) - var(--sl-sidebar-width)) /
2
);
}
}
}
</style>

View File

@@ -1,8 +1,12 @@
---
const { class: className, ...rest } = Astro.props
const { class: _className } = Astro.props
import { Image } from 'astro:assets'
import { Image } from 'astro:assets'
---
<a href={Astro.props.href} target="_blank" class:list={["flex hover:border-xahau-green hover:bg-gray-50 !text-black !no-underline items-center justify-center p-4 text-center bg-white font-bold border-black border-2",className]}>
<a
href={Astro.props.href}
target="_blank"
class:list={["flex hover:border-xahau-green hover:bg-gray-50 !text-black !no-underline items-center justify-center p-4 text-center bg-white font-bold border-black border-2",_className]}
>
{Astro.props.imageSrc ? <Image src={Astro.props.imageSrc} alt={Astro.props.title} class="w-auto h-auto max-h-2/5" /> : Astro.props.title}
</a>

View File

@@ -1,16 +1,28 @@
---
import { Image } from 'astro:assets'
import logo from '../assets/xahau-logo.svg'
import { Image } from 'astro:assets'
import logo from '../assets/xahau-logo.svg'
---
<footer class="bg-white text-base font-regular text-black **:text-black **:no-underline">
<div class="flex-none container mx-auto py-12 max-w-7xl p-6 grid grid-cols-1 md:grid-cols-10 gap-4">
<footer
class="bg-white text-base font-regular text-black **:text-black **:no-underline"
>
<div
class="flex-none container mx-auto py-12 max-w-7xl p-6 grid grid-cols-1 md:grid-cols-10 gap-4"
>
<div class="col-span-1 md:col-span-3 flex flex-col gap-3">
<a href="/"><Image src={logo} class="w-1/2" alt="Xahau" /><a>
<p>This website is open source and open for contributions <a href="https://github.com/Xahau/xahau-web" target="_blank">on GitHub</a></p>
<a href="/">
<Image src={logo} class="w-1/2" alt="Xahau"/>
</a>
<p>
This website is open source and open for contributions
<a href="https://github.com/Xahau/xahau-web" target="_blank"
>on GitHub</a
>
</p>
</div>
<div class="col-span-1 md:col-span-2 md:col-start-5 flex flex-col gap-3">
<p><strong>Xahau</strong></p>
<p>
<strong>Xahau</strong>
</p>
<a href="/about">About</a>
<a href="/features">Features</a>
<a href="/ecosystem">Ecosystem</a>
@@ -18,10 +30,12 @@ import logo from '../assets/xahau-logo.svg'
<a href="/docs/compliance/responsible-disclosure">Break Xahau</a>
<a href="/fraud-report">Report Fraud</a>
<a href="/docs/resources/media-kit">Media kit</a>
<a href="/privacy-policy">Privacy Policy</a>
<a href="/privacy-policy">Privacy Policy</a>
</div>
<div class="col-span-1 md:col-span-2 flex flex-col gap-3">
<p><strong>Documentation</strong></p>
<p>
<strong>Documentation</strong>
</p>
<a href="/docs">Get started</a>
<a href="/docs/protocol-reference/transactions">Protocol Reference</a>
<a href="/docs/hooks">Hooks</a>
@@ -30,10 +44,16 @@ import logo from '../assets/xahau-logo.svg'
<a href="/docs/resources/whitepaper">Whitepaper</a>
</div>
<div class="col-span-1 md:col-span-2 flex flex-col gap-3">
<p><strong>Connect</strong></p>
<p>
<strong>Connect</strong>
</p>
<a href="/connect">Events</a>
<a href="/contest">Dev Contest</a>
<a href="https://x.com/XahauNetwork" target="_blank">X</a>
<a href="https://github.com/Xahau" target="_blank">GitHub</a>
<a href="https://discord.com/invite/UzU58haAn4" target="_blank">Community Discord</a>
<a href="https://discord.com/invite/UzU58haAn4" target="_blank">
Community Discord
</a>
</div>
</div>
</footer>

View File

@@ -19,6 +19,8 @@ import {
import { useState } from 'react'
const socials = [
{ name: 'Events', href: '/connect' },
{ name: 'Dev Contest', href: '/contest' },
{ name: 'X', href: 'https://x.com/XahauNetwork' },
{ name: 'GitHub', href: 'https://github.com/Xahau' },
{ name: 'Community Discord', href: 'https://discord.com/invite/UzU58haAn4' },

View File

@@ -1,61 +1,59 @@
---
const { class: className, ...rest } = Astro.props
const { class: _className } = Astro.props
import { Image } from 'astro:assets'
import gem1 from '../assets/gems/1.png'
import gem2 from '../assets/gems/2.png'
import gem3 from '../assets/gems/3.png'
import gem4 from '../assets/gems/4.png'
import gem5 from '../assets/gems/5.png'
import gem6 from '../assets/gems/6.png'
import gem7 from '../assets/gems/7.png'
import gem8 from '../assets/gems/8.png'
import gem9 from '../assets/gems/9.png'
import gem10 from '../assets/gems/10.png'
import gem11 from '../assets/gems/11.png'
import gem12 from '../assets/gems/12.png'
import gem13 from '../assets/gems/13.png'
import gem14 from '../assets/gems/14.png'
import gem15 from '../assets/gems/15.png'
import gem16 from '../assets/gems/16.png'
import gem17 from '../assets/gems/17.png'
import { Image } from 'astro:assets'
import gem1 from '../assets/gems/1.png'
import gem2 from '../assets/gems/2.png'
import gem3 from '../assets/gems/3.png'
import gem4 from '../assets/gems/4.png'
import gem5 from '../assets/gems/5.png'
import gem6 from '../assets/gems/6.png'
import gem7 from '../assets/gems/7.png'
import gem8 from '../assets/gems/8.png'
import gem9 from '../assets/gems/9.png'
import gem10 from '../assets/gems/10.png'
import gem11 from '../assets/gems/11.png'
import gem12 from '../assets/gems/12.png'
import gem13 from '../assets/gems/13.png'
import gem14 from '../assets/gems/14.png'
import gem15 from '../assets/gems/15.png'
import gem16 from '../assets/gems/16.png'
import gem17 from '../assets/gems/17.png'
const gemMap = {
'1': gem1,
'2': gem2,
'3': gem3,
'4': gem4,
'5': gem5,
'6': gem6,
'7': gem7,
'8': gem8,
'9': gem9,
'10': gem10,
'11': gem11,
'12': gem12,
'13': gem13,
'14': gem14,
'15': gem15,
'16': gem16,
'17': gem17,
}
const gemMap = {
'1': gem1,
'2': gem2,
'3': gem3,
'4': gem4,
'5': gem5,
'6': gem6,
'7': gem7,
'8': gem8,
'9': gem9,
'10': gem10,
'11': gem11,
'12': gem12,
'13': gem13,
'14': gem14,
'15': gem15,
'16': gem16,
'17': gem17,
}
const gem = gemMap[Astro.props.gem as keyof typeof gemMap] || gem1
const _gem = gemMap[Astro.props.gem as keyof typeof gemMap] || gem1
var gemSize = 'size-80'
if (Astro.props.gemSize && Astro.props.gemSize === 'large') {
gemSize = 'size-120 -top-40'
}
var _gemSize = 'size-80'
if (Astro.props.gemSize && Astro.props.gemSize === 'large') {
_gemSize = 'size-120 -top-40'
}
---
<div class:list={["flex",className]}>
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6">
{Astro.props.align ? (
<div class:list={["flex",_className]}>
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6">
{Astro.props.align ? (
<div class="grid grid-cols-1 md:grid-cols-5" >
{Astro.props.align === "right" && Astro.props.gem && (
<div class="relative overflow-visible invisible md:visible">
<Image loading={Astro.props.loading} src={gem} alt="Gem" class={`overflow-visible ${gemSize} absolute inset-0 m-auto -left-60 object-cover`} />
<Image loading={Astro.props.loading} src={_gem} alt="Gem" class={`overflow-visible ${_gemSize} absolute inset-0 m-auto -left-60 object-cover`} />
</div>
)}
<div class={
@@ -69,12 +67,12 @@ if (Astro.props.gemSize && Astro.props.gemSize === 'large') {
</div>
{Astro.props.align === "left" && Astro.props.gem && (
<div class="relative overflow-visible invisible md:visible">
<Image loading={Astro.props.loading} src={gem} alt="Gem" class={`overflow-visible ${gemSize} absolute inset-0 m-auto -right-150 object-cover`} />
<Image loading={Astro.props.loading} src={_gem} alt="Gem" class={`overflow-visible ${_gemSize} absolute inset-0 m-auto -right-150 object-cover`} />
</div>
)}
</div>
) : (
<slot />
)}
</div>
</div>
</div>
</div>

View File

@@ -22,12 +22,7 @@ It also covers the different ledger objects integral to the network's operation,
### Infrastructure
The Infrastructure section provides detailed instructions for setting up the build environment on both Ubuntu 22.04 and macOS 13.5.2.
Infrastructure is the core of the Xahau Network. Servers running the xahaud software enable users to do things like submit, verify, and query transactions. The documentation in this section provides instructions for installing, updating, configuring, and building xahaud. Concepts, such as attesting to the identity of a given server or running xahaud as a validator, are also discussed.
In the 'Building Xahau' chapter, you will find a step-by-step guide through the process of establishing environmental variables, installing core and Xahaud dependencies, and compiling the software.
This includes the acquisition and setup of essential components like LLVM, Boost, WasmEdge, and Protobuf. The steps explain why certain versions and configurations are needed to ensure compatibility and optimal performance.
This section ends with cloning the Xahau repository and creating the Xahaud target, setting developers on the path to adding to or deploying the Xahau network.
**We hope this documentation provides you with the information you need to understand, use, and contribute to Xahau. Happy exploring!**
**We hope this documentation provides you with the information you need to understand, use, and contribute to the Xahau Network. Happy exploring!**

View File

@@ -0,0 +1,57 @@
---
title: Advanced xahaud Configuration
---
There are numerous configuration options available to xahaud operators. This section will cover some of the more commonly used options, including those required for clustering servers and configuring databases.
For complete documentation on configuration options, please see the example configuration files in the [xahaud GitHub repository](https://github.com/Xahau/xahaud/tree/dev/cfg).
## Running Databases in Memory
Users seeking to maximize xahaud performance may choose to run databases in memory, rather than on dedicated storage media. Memory databases are not suited for machines storing history, as the databases are not persistent across xahaud restarts. Likewise, the amount of history stored is contingent on available system memory. Thus, `online_delete` and `advisory_delete` are required in the `xahaud.cfg` to prevent out of memory errors. When using a memory database, it is advisable to disable SWAP, as SWAP writes the contents of memory to disk, thereby potentially defeating the benefits obtained by storing the database in memory.
To enable the memory database, edit the `xahaud.cfg` file:
```
[relational_db]
type=RWDB
[node_db]
type=RWDB # RWDB is the memory database
online_delete=256 # This value should be low on machines using memory databases. '256' is the minimum value.
advisory_delete=0 # Do not require human intervention to delete history. This is necessary for preventing out of memory errors.
```
## Clustering
Clustering allows xahaud operators to configure multiple xahaud servers so that the servers trust one another, thereby reducing workload. Properly clustered servers can share information about malicious or problematic websocket, rpc, and peer connections, while also automatically propagating submitted transactions throughout the cluster. Thus, if a transaction is submitted on a sever with a higher load than the transaction's fee allows for, the transaction will still propagate to other servers in the cluster, thereby increasing the probability that the transaction is included in an upcoming ledger.
Administrators operating xahaud validators can benefit from clustering, as the cluster provides connectivity for the highly secure validator, thereby eliminating the need for the validator to connect to unknown or untrusted servers.
Server operators should not cluster their servers with servers outside of their own control. Likewise, clustered servers should have low latency connections, ideally being located in the same data center.
Generating cluster seeds (public/private keys) is done via the `validation_create` [API method](../../features/http-websocket-apis/admin-api-methods). While the method name includes the term 'validation', this method is not used to [create the keys](../enabling-validation) used to sign validation messages. Instead, it is used to create keys to identify any xahaud server, validating or non-validating.
To create a cluster:
1. On each xahaud instance that will be included in the cluster, generate a public key and seed: `./xahaud validation_create`
2. Open each server's `xahaud.cfg` file, and add or edit the following sections:
* `[ips_fixed]` - Include the IPv4/6 addresses and peer listening ports (e.g., `10.1.1.2 21337`) for other servers that will be in the cluster. The listening port is defined under the `[port_peer]` stanza in the `xahaud.cfg` file on the server listening for incoming connections. The default listening port for the main Xahau Network is `21337`.
* `[node_seed]` - The output in the `validation_seed` field from the `validation_create` command. This is a private key, and it must be installed on the same server on which it was generated.
* `[cluster_nodes]` - The output from the `validation_public_key` field of the `validation_create` command. This is a public key, and it must be installed on peer servers, not the server on which it was generated.
3. Restart xahaud on each server in the cluster: `systemctl restart xahaud`
4. Backup each server's `xahaud.cfg`.
5. Verify connectivity among clustered peers via the [peers](../../features/http-websocket-apis/admin-api-methods) API method: `./xahaud peers`
The cluster section of a `xahaud.cfg` file might look like this:
```
[ips_fixed]
10.1.1.2 21337 # Clustered peer 1
10.1.1.3 21337 # Clustered peer 2
10.1.1.4 21337 # Clustered peer 3
[cluster_nodes]
n9LzAHaB7ka318dAJWLQD1WkpGR86NyvaCzrtUAt4PuNtDCTCqxn # validation_public_key from clustered peer 1
n9KWNMsRdQ66jYHLCVgFBAQAzb16DwDioVdXSuV8pTcfEfaHkdvZ # validation_public_key from clustered peer 2
n9JFK8xUcy9S9TBmCcZKKmY28LEVjTurcpzC5XkXnyAAj1Svytee # validation_public_key from clustered peer 3
[node_seed]
sn8QEFTpBM8nydnLD6FjxKN845uRG # Private validation_seed from the local xahaud instance
```

View File

@@ -1,15 +1,18 @@
---
title: Enabling Validations in xahaud
title: Enabling Validation in xahaud
---
Validators are xahaud nodes that are configured with an additional public/private keypair, which is used to sign each proposed ledger. Thus, validators are the primary mechanism used to achieve consensus regarding the order in which transactions are applied on the Xahau Network.
## Background Considerations
Running a validating xahaud server may seem straight forward, however, there are a number of considerations for production node operators including uptime and security. This following introductory sections provide background on these considerations.
### Security and Availability
When running xahaud as a validator, system security and availability are critical. Validator operators are expected to actively monitor their servers and to respond quickly to outages. Some validator operators choose to host standby machines in diverse data centers, so they can quickly recover from outages. While it is possible to host a reliable validator in one's home, it is unlikely that such a setup could provide sufficient stability and security for the validator to gain broader trust (e.g., inclusion on published UNLs). Similarly, validator operators are strongly discouraged from running software other than xahaud on a machine used as a xahaud validator, since this increases the probability of running out of resources or exposing a security vulnerability. System administrators who require websocket or RPC access to a server are encouraged to run different machines for queries, so resources are not taken away from the critical task of validating ledgers.
<br></br>
The private/public validation keypair should be stored and backed up in a secure, offline environment. Anyone with access to the keys of a trusted validator has potential to harm the network. After installing a validation token into the xahaud.cfg file, it is advised to restrict read access (`chmod 400 xahaud.cfg`) and change ownership of the file to "root" or "xahaud", depending on the type of install (`chown root:root xahaud.cfg`).
### Identity Attestation
To avoid a [Sybil attack](https://en.wikipedia.org/wiki/Sybil_attack) and build trust, validating xahaud nodes attest to their identity by cryptographically signing a domain name with their validation keys. This signature is then hosted at the same domain, in a TOML format file. In addition to verifying the identity of a validator, this TOML file can also be used to verify the identity of individual account holders on the Xahau Network, by providing an attestation signed by the private account key instead of the private validation key. The TOML file should be hosted on a web server with TLS encryption enabled at:<br></br><code>https://[your-domain.com]/.well-known/xah-ledger.toml</code><br></br>
To avoid a [Sybil attack](https://en.wikipedia.org/wiki/Sybil_attack) and build trust, validating xahaud nodes attest to their identity by cryptographically signing a domain name with their validation keys. This signature is then hosted at the same domain, in a [TOML format file](../identity). In addition to verifying the identity of a validator, this TOML file can also be used to verify the identity of individual account holders on the Xahau Network, by providing an attestation signed by the private account key instead of the private validation key. The TOML file should be hosted on a web server with TLS encryption enabled at:<br></br><code>https://[your-domain.com]/.well-known/xahau.toml</code><br></br>
### Peering
To maintain a high level of security, xahaud nodes that are configured as validators should only peer with known, trusted peers. Enabling the `peer_private` setting and explicitly defining `ips_fixed` in the xahaud.cfg file will force a server to only connect to defined peers. Operating system and hardware level protections, such as firewalls, provide additional reassurance that the server is only connecting to defined peers. However, this can be a challenge, as validators with too few peers, typically less than about five, are at risk of falling out of sync with the rest of the network.
@@ -23,17 +26,23 @@ The Xahau Network utilizes the [Governance Game](../../features/governance-game)
4. A proactive approach to updating and voting for [amendments](../../features/amendments) and fees
- This requires taking the time to watch what is in development
## Enabling Validation
Switching a stock xahaud server into a validator is a straight forward process. Essentially, users will generate a public/private keypair, which is then used to generate a token using an ephemeral key derived from the master pair. That token is installed into the `xahaud.cfg` file, thereby instructing xahaud to propose validations to the Network.
### Building the Validation Keys Tool
At this time, there is not a packaged tool for generating validation keys. Thus, users can either build the tool from scratch or rely on a packaged version provided with rippled (this tool is not packaged with the xahaud binary). The instructions for building the tool are the same as the instructions for building rippled, and they are provided on the [ripple/validator-keys-tool](https://github.com/ripple/validator-keys-tool) repository page. There are also some [packaged binaries](https://github.com/jscottbranson/rippled-examples/blob/master/validator-keys) available on unofficial repositories.
At this time, there is not an official release of the software used for generating validation keys. Thus, users can either build the tool from scratch or rely on a packaged version provided with rippled (this tool is not packaged with the xahaud binary). The instructions for building the tool are the same as the instructions for building rippled, and they are provided on the [ripple/validator-keys-tool](https://github.com/ripple/validator-keys-tool) repository page. There are also some [packaged binaries](https://github.com/jscottbranson/xahau-examples/) available in unofficial repositories. Users seeking to generate keys for production validators should build the tool from scratch on a secure, air-gapped machine.
While xahaud provides the `validation_create` [Admin API method](../../features/http-websocket-apis/admin-api-methods), this method is NOT capable of generating the necessary validation token or allowing for domain verification. Thus, despite the name, the `validation_create` method is used to create public/private keys to identify a server broadly, for example when [clustering multiple servers](../advanced-configuration).
### Generating and Installing Validation Keys
Consider using an offline machine to generate validation keys and a validation token.
1. Navigate to the directory containing the validation keys tool: `cd [/path/to/tool]`
2. Generate a new keypair: `./validator-keys create_keys`
3. The newly generated keypair is stored in `/home/[username]/.ripple/validator-keys.json`.
3. The newly generated keypair is stored in `/home/[username]/[.ripple or .xahaud]/validator-keys.json`. The storage path depends on which version of the validator-keys-tool is used.
4. Ideally, validators should provide identity attestation. To do so, set your domain in the validator-keys.json file: `./validator-keys set_domain [example.com]`
- If you do not wish to provide an identifying domain, generate a validation token without a domain: `./validator-keys create_token --keyfile /home/[username]/.ripple/validator-keys.json`
- If you do not wish to provide an identifying domain, generate a validation token without a domain: `./validator-keys create_token --keyfile /home/[username]/.xahaud/validator-keys.json`
5. Review the output of the previous command. Note the `[validator_token]`, as this will be installed in xahaud.cfg to enable validation. If a domain was set, note the `attestation=""` line, as it will need to be added into the TOML file served at your domain.
- Anytime the tool is used to generate a new `validator_token`, a field, `token_sequence`, is incremented in the `validator-keys.json` file. The Network will ignore validations from any server that has a token generated with a lower sequence number than the highest observed number. For example, if your validation token has sequence number "3" and you generate a new token with sequence number "2", validations from any machine using the new token with the lower sequence number will be ignored. This feature enables server operators to generate a new token, rather than generating new master validation keys, in the event of a security compromise or other incident.
6. Open xahaud.cfg and paste in the `[validation_token]`, then restart the xahaud service.
7. Paste the `attestation=""` into your TOML file to prove the identity of your validator.
7. Paste the `attestation=""` into your [TOML](../identity) file to prove the identity of your validator.
8. Ensure private validation keys are stored securely, ideally separate from the validator.

View File

@@ -0,0 +1,179 @@
---
title: Serving a TOML File for Identity Verification
---
***Identity verification requires two parts. NEVER TRUST TOML FILES OR ON NETWORK VALIDATOR/ACCOUNT ATTESTATIONS ALONE TO CONFIRM IDENTITY, AS ANYONE CAN SET THEM. A website (URL) must claim ownership of the validator/account, and the on-network data must match.***
Given that trust is foundational to the Xahau Network, it is ideal for entities operating xahaud validators to take credit for their servers. Identity attestation provides users with assurances that one entity isn't gaining disproportionate control over the trusted (default UNL) validators in the Network. This is is done by publishing two attestations: one from a validating server on the Xahau Network and a second from a web server that serves the identifying domain over TLS. Thus, the validator claims association with the web domain and the web domain claims association with the validator. *Without both of these claims, it is not possible to trust the identity attestation.*
Similarly, individual Xahau account holders might wish to publish a TOML file attesting that specific accounts on the network are under their control. Account ownership attestations are particularly relevant for enterprises, such as exchanges or financial institutions. As with validators, these attestations require two parts: a web server that claims ownership of a Xahau Network address as well as an on-network account address that claims to be owned by the same domain. Account attestations provide users with confidence that they are routing deposits to the correct address.
The contents and structure of this file are similar to those used by [Stellar](https://developers.stellar.org/docs/tokens/publishing-asset-info) and the [XRP Ledger](https://xrpl.org/docs/references/xrp-ledger-toml). Since the file can contain custom fields, it is important to allow flexibility when building tools designed to parse the TOML file.
## Web Server and DNS Configuration
1. The file contents must be in the [TOML format](https://github.com/toml-lang/toml).
2. The TOML file must be served from: `https://[optional-subdomain.your-domain.com]/.well-known/xahau.toml`
* The path `/.well-known/xahau.toml` must not be altered. The path must be all lower case.
* [RFC 5785](https://datatracker.ietf.org/doc/html/rfc5785) contains more information on the "/.well-known/" path.
3. A TLS certificate chaining to a trusted certificate authority must be used to encrypt connections serving the TOML file.
4. DNS Sec is recommended for the domain.
5. Subdomains may be used to serve the file, and identical files may be hosted from multiple subdomains.
6. Content type for the file is `application/toml`.
7. The TOML file must be served with a CORS header: `Access-Control-Allow-Origin: *`
8. Additional headers may be served with the TOML file, if needed.
9. Custom or nonstandard fields may be added to the TOML file, as required by individual users.
10. No field is strictly required in the TOML file.
### CORS Configuration
Apache:
```
<Location "/.well-known/xahau.toml">
Header set Access-Control-Allow-Origin "*"
</Location>
```
Nginx:
```
location /.well-known/xahau.toml {
add_header 'Access-Control-Allow-Origin' '*';
}
```
### TOML File Contents
TOML files are typically subdivided into sections describing the TOML file itself (metadata), principals (responsible parties), and claimed assets including: validators, non-validating xahaud servers, accounts, and issued currencies.
#### Example TOML
The below example is intended to illustrate all sections that are commonly included in a Xahau Network TOML file. Individual users may not have all of these sections in their TOML file, and some users may need to include multiple of the same section. For example, if one exchange issues multiple currencies, it would include a `[[CURRENCIES]]` section for each IOU issued on the Network.
```
[METADATA]
modified = 2025-08-04T14:24:34.123Z
expired = 2025-12-31T14:24:34.123Z
[ORGANIZATION]
name = "A Company B.V."
website = "https://example.com"
email = "contact@example.com"
[[PRINCIPALS]]
name = "A. Person"
email = "a_person@example.com"
social_1 = "https://www.linkedin.com/company/incfintech"
x = "@IncFinTech"
[[VALIDATORS]]
public_key = "nHBixLw8q7XUP5AKceK2aZriN67PPjQW7JJ7hLkJgxvkTTs5go6k"
attestation = "07FA61020CA5E0605BE29D213DCC33F934B631EB6215F52D3E99D8AEA841272E300758B5C03CD2332190307324B4869838B77BAD275B31CF59D13E8FA6A8780B"
owner_country = "US"
server_country = "CA"
network_asn = "398726"
network = "21337"
unl = "https://vl.xahau.org"
[[SERVERS]]
ws = "wss://"
json_rpc = "https://"
peer = "https://"
network = "21337"
[[ACCOUNTS]]
address = "rabc..."
network = "21337"
desc = "This wallet is used for client deposits."
[[CURRENCIES]]
code = "USD"
issuer = "rabc..."
symbol = "$"
network = "21337"
display_decimals = 2
[[CURRENCIES]]
code = "EUR"
issuer = "rabc..."
symbol = "€"
network = "21337"
display_decimals = 2
```
#### Metadata
Dates/times in the TOML file should be specified in UTC and include millisecond precision. For example, `2025-08-04T14:24:34.123Z`. Only one metadata section can be included in a TOML file.
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`modified`</td><td>Date-Time</td><td>Date and time when the TOML was most recently modified.</td></tr>
<tr><td>`expires`</td><td>Date-Time</td><td>After this date/time, the TOML file will be considered expired and thus invalid.</td></tr>
</table>
#### Organization
If an entity rather than an individual is claiming responsibility for the TOML file, that entity should use this section to identify itself. It would be unusual and likely an error for one TOML file to have multiple `[ORGANIZATION]` sections. If multiple sections are needed, ensure an additional set of brackets are added: `[[ORGANIZATION]]`.
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`name`</td><td>String</td><td>The name of organization hosting the TOML file.</td></tr>
<tr><td>`email`</td><td>String</td><td>Email address for the organization.</td></tr>
<tr><td>`website`</td><td>String</td><td>Website for the organization (typically this is the same as the URL where the TOML is hosted).</td></tr>
<tr><td>`social_[x]`</td><td>String</td><td>Link to a social media profile. This field is not standardized at this time. Thus, `x = "@IncFinTech` and `social_1 = https://x.com/IncFinTech` are both valid.</td></tr>
</table>
#### Principals
This section is used to identify individual points of contact for the Xahau Network infrastructure and/or accounts.
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`name`</td><td>String</td><td>The name of an individual responsible for overseeing the organizations Xahau Network operations.</td></tr>
<tr><td>`email`</td><td>String</td><td>Email address for the principal.</td></tr>
<tr><td>`website`</td><td>String</td><td>Website for the principal.</td></tr>
<tr><td>`social_[x]`</td><td>String</td><td>Link to a social media profile. This field is not standardized at this time. Thus, `x = "@IncFinTech` and `social_1 = https://x.com/IncFinTech` are both valid.</td></tr>
</table>
#### Validators
Validator operators are strongly encouraged to publish an attestation as proof of ownership. Providing geographic and ISP information is important, as it enables trusted (dUNL) list publishers to evaluate the geographic diversity of trusted validators on the network. If too many trusted validators are concentrated in one geographic region or on one network ASN, there is a risk to the broader network.
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`public_key`</td><td>String</td><td>The master public key used to validations.</td></tr>
<tr><td>`attestation`</td><td>String</td><td>Domain attestation generated by the validator-keys tool.</td></tr>
<tr><td>`owner_country`</td><td>String</td><td>[ISO-3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) country code for the entity or person in charge of the server.</td></tr>
<tr><td>`server_country`</td><td>String</td><td>ISO-3166-2 country code for the server's physical location.</td></tr>
<tr><td>`network_asn`</td><td>String</td><td>The Autonomous System Number (ASN) for the Internet Service Provider(s) providing internet connectivity to the server.</td></tr>
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the server participates in.</td></tr>
<tr><td>`unl`</td><td>String</td><td>A URL hosting the list of trusted validators that the validator subscribes to.</td></tr>
</table>
#### Servers
Network participants who provide public peering or API access via websocket or RPC can publish details for accessing individual servers.
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`ws`</td><td>String</td><td>The URL for public websocket access. This begins with "ws:// or wss://".</td></tr>
<tr><td>`json_rpc`</td><td>String</td><td>The URL for public RPC access. This begins with "http:// or https://".</td></tr>
<tr><td>`peer`</td><td>String</td><td>URL other servers can use to peer with the server identified in the TOML.</td></tr>
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the server participates in.</td></tr>
</table>
#### Accounts
Entities needing account verification can use this section to claim ownership of a given Xahau Network wallet.
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`address`</td><td>String</td><td>The encoded public key (beginning with `r`) identifying a Xahau Network wallet.</td></tr>
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the wallet is used on.</td></tr>
<tr><td>`desc`</td><td>String</td><td>Human readable description of what the wallet is used for.</td></tr>
</table>
#### Currencies
It is possible for multiple wallets to issue currencies with the same currency code. ***Thus, it is critical that users verify the issuing wallet as well as the currency code.***
<table>
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
<tr><td>`code`</td><td>String</td><td>The ticker symbol of the token as three digits or 40 hex characters. This field is case sensitive.</td></tr>
<tr><td>`issuer`</td><td>String</td><td>The wallet address (beginning with `r`) that issued the currency. The referenced wallet should be present in the `[[ACCOUNTS]]` section of the TOML file.</td></tr>
<tr><td>`symbol`</td><td>String</td><td>The symbol (e.g., "$") used to identify the currency.</td></tr>
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the currency is issued on.</td></tr>
<tr><td>`display_decimals`</td><td>Integer</td><td>The number of digits to the right of the decimal point that clients should display when showing quantities of the currency.</td></tr>
</table>
## Validator Domain Verification
Hosting the `xahau.toml` file enables domain owners to claim ownership of a validator. However, it is critical that the validator also acknowledge this ownership, so third parties can reliably trust network operators. Since validators form the backbone of forward progress on the Xahau Network, it is important that operators appropriately secure their private validation keys.
If you are not familiar with the Validator Keys Tool, see the page on [Enabling Validation in xahaud](../enabling-validation).
Users who have already complete the steps on the Enabling Validation page do not need to repeat them. Simply paste the `attestation = ""` field into the TOML file and ensure the correct `[validator_token]` is installed in the `xahaud.cfg`.
Users who did not configure a domain when they initially generated a validation token may do so by running `./validator-keys set_domain [example.com]`. Prior to attempting to set the domain, ensure that the master validation key JSON file is stored in the correct path: `/home/[username]/[.ripple or .xahaud]/validator-keys.json`.
## Wallet Address Verification
Consistent with validator domain verification, verifying ownership of a wallet address on the Xahau Network requires two components: A TOML file served over a TLS encrypted connection (with a properly chained certificate) from the domain claiming ownership and a transaction from the wallet address verifying the ownership claim. To claim ownership of a wallet address:
1. Include the address as an `[[accounts]]` section in the TOML file.
2. Submit an [AccountSet transaction](../../protocol-reference/transactions/transaction-types/accountset) with the `Domain` field specified.

View File

@@ -3,7 +3,7 @@ title: Interacting With xahaud Using Websocket and RPC
---
The xahaud software provides both websocket and RPC interfaces that can be configured for a variety of use cases, such as submitting transactions or querying ledger history. Some users may choose to place proxy software in front of xahaud to provide encryption, load balancing, or other benefits. It is possible to install TLS certificates in the xahaud.cfg file using parameters such as `ssl_key = [/path/to/key]`.
### Configuring Websocket and RPC Ports
## Configuring Websocket and RPC Ports
To enable listening ports, edit the `xahaud.cfg` file. Enabled ports are listed under the `[server]` stanza in the configuration file. Each port listed under the `[server]` section must be further defined via it's own stanza. In addition to configuring websocket or RPC ports, administrators can also configure the port used to listen for incoming peer connections (`port_peer`). On validating servers, it is ideal to remove `port_peer` from the configuration file, to avoid incoming connections. A configuration file with the peer protocol, one websocket port, and one RPC port might look like:<br></br><br></br>
```

View File

@@ -3,7 +3,7 @@ title: System Requirements
---
Hardware requirements for nodes customized for various tasks (e.g., RPC/WS, hubs, validators, etc.) should be consistent with the specs outlined below. Consider tailoring your individual system based on your intended use case.
### Types of Nodes
## Types of Nodes
It is possible to run xahaud in diverse configurations, based on a users needs. Similarly, one xahaud server can be configured for multiple purposes, such as a full history server that is also used for RPC/WS calls. The server's purpose dictates necessary system requirements. Some xahaud configurations might include:
1. Stock server - This term is commonly used to refer to any xahaud node that is not configured as a validator. A stock server generally has very few changes from the default configuration.
2. Full history servers - Are useful for querying historic data. In addition to a large amount of storage space, potentially higher disk IOPS and network bandwidth are needed, depending on the number of users querying the server.
@@ -11,7 +11,7 @@ It is possible to run xahaud in diverse configurations, based on a users needs.
4. Hub server - Peering between nodes is critical for relaying messages across the Xahau Network, and a single server can be configured to provide peering for hundreds of peers. However, a large amount of bandwidth can be required (10 Gbit+).
5. [Validating servers](../enabling-validation) - Validators differ from other types of nodes, in that they require an additional cryptographic key to be installed, so they can sign off on the sequence of transactions in a proposed ledger. As availability and security are critical, it is not recommended to use a validator for other functions.
### General Notes
## General Notes
* Builds are typically tested on Ubuntu LTS. However, Docker, portable binaries, custom builds, and other install methods allow for diverse operating system support.
* Typically one IPv4 and/or IPv6 address is needed for each xahaud instance. Running multiple instances behind one IPv4 address is not recommended.
* Machines storing full history must use XFS or similar to avoid limitations with single file size in EXT4 (max. file size of 16TB). If storing less history, EXT4 is sufficient.
@@ -19,6 +19,6 @@ It is possible to run xahaud in diverse configurations, based on a users needs.
* These system requirements may grow over time. For example, disk space for full history servers is consistently increasing.
* As of August 6, 2025 <strong>the full history for the Xahau Network is approximately 8TB</strong>.
### Recommended Specs for Production xahaud Servers
## Recommended Specs for Production xahaud Servers
<table><thead><tr><th width="140"></th><th width="200">Minimum</th><th width="199">Preferred</th><th>Ideal</th></tr></thead><tbody><tr><td>CPU (2.5+ GHz x86_64)</td><td>8 cores</td><td>20 cores</td><td>40+ cores</td></tr><tr><td>Memory</td><td>32GB</td><td>64GB</td><td>128GB+</td></tr><tr><td>Disk IO (sustained)</td><td>15k random RW</td><td>20k random RW</td><td>30k random RW</td></tr><tr><td>Disk Size</td><td>500GB</td><td>1TB</td><td>20TB+</td></tr><tr><td>Filesystem</td><td>XFS</td><td>XFS</td><td>XFS</td></tr><tr><td>Network IO</td><td>500Mbit+</td><td>1Gbit</td><td>10Gbit</td></tr></tbody></table>

View File

@@ -3,7 +3,7 @@ title: Updating xahaud
---
The process for updating xahaud varies depending on the install method used, however, all three methods rely on the releases published at [https://build.xahau.tech](https://build.xahau.tech). When updating a validator, hub, or other 'critical' infrastructure, please check the network health prior to restarting a server to install an update. It is possible to automate the update process using a crontab entry and an update script, however, administrators are discouraged from doing so, as automatic updates may result in restarts at times when the network is unstable. Similarly, human presence allows operators to ensure updates are successful, thereby minimizing downtime.
### Backup
## Backup
Users should always keep backups of:
1. The primary configuration file: `xahaud.cfg`
- Location varies based on install type.
@@ -13,7 +13,7 @@ Users should always keep backups of:
- Located in the database directory defined in 'xahaud.cfg'.
4. Validators must keep their validation private key backed up in a secure, offline location.
### Updating Docker Containers
## Updating Docker Containers
Updating xahaud inside a Docker container involves replacing the currently running binary with the new version, downloaded from [https://build.xahau.tech](https://build.xahau.tech). This can be accomplished either by replacing the xahaud binary inside the container or by updating the entire container.
<br></br>
To update the xahaud binary inside a running Docker container:
@@ -30,7 +30,7 @@ To replace the current Docker image with a new version, without overwriting data
5. Remove the old instance: `docker rm xahaud-[mainnet/testnet]`
6. Start the new instance: `./build && ./up`
### Updating Local Installations
## Updating Local Installations
To update a locally installed version of xahaud, simply replace the current binary with a new binary:
1. Download the new binary from: [https://build.xahau.tech](https://build.xahau.tech)
2. Mark the new binary executable: `chmod +x [/path/to/download]`
@@ -41,7 +41,7 @@ To update a locally installed version of xahaud, simply replace the current bina
<br></br>
A [script](https://gist.githubusercontent.com/WietseWind/9480a4fc95e904e54524406005c8c963/raw/2b200fdc2e5b471ae4f6625674aff1765d63e744/update.sh) that automates the above steps is available.
### Updating Binary Files
## Updating Binary Files
Updating the xahaud binary files is essentially the same as the original install instructions:
1. Remove the currently running version: `rm [/path/to/xahaud]`
2. Download the new version: [https://build.xahau.tech](https://build.xahau.tech)

View File

@@ -42,7 +42,7 @@ To remove the `Domain` field from an account, send an AccountSet with the Domain
You can put any domain in your account's `Domain` field. To prove that an account and domain belong to the same person or business, you need a "two-way link":
* Accounts you own should have a domain you own in the `Domain` field.
* At that domain, host an xah-ledger.toml file listing accounts you own, and optionally other information about how you use Xahau.
* At that domain, host a [xahau.toml](../../../infrastructure/identity) file listing accounts you own, and optionally other information about how you use Xahau.
### AccountSet Flags

View File

@@ -0,0 +1,101 @@
---
title: CronSet
description: >-
A CronSet transaction enables Hooks to schedule recurring self-invocations at
regular intervals, similar to Linux cronjobs. This facilitates complex
governance structures and automated processes within Hook frameworks.
---
\[[Source](https://github.com/Xahau/xahaud/blob/dev/src/ripple/app/tx/impl/CronSet.cpp)]
_(Added by the CronSet amendment.)_
### Example
```json
{
"TransactionType": "CronSet",
"Account": "rYourAccountAddress",
"StartTime": 816348759,
"RepeatCount": 3,
"DelaySeconds": 120
}
```
| Field | JSON Type | \[Internal Type]\[] | Description |
| -------------- | --------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Account` | String | AccountID | The Hook account initiating the cron. This is the account that will be invoked when the cron executes. |
| `StartTime` | Number | UInt32 | _(Optional)_ Ripple Epoch timestamp when the first execution should occur. Use `0` for immediate execution. If omitted when deleting a cron, the transaction removes the cron. |
| `RepeatCount` | Number | UInt32 | _(Optional)_ Number of times the cron should execute (maximum 256 per transaction). Can be extended via subsequent CronSet transactions. Omit when deleting a cron. |
| `DelaySeconds` | Number | UInt32 | _(Optional)_ Time interval in seconds between each execution. Omit when deleting a cron. |
### How CronSet Works
CronSet transactions enable scheduled, automated Hook execution on the Xahau blockchain at regular intervals, eliminating the need for external services or manual triggers.
The workflow involves four key steps:
1. Install a Hook with the `hsfCOLLECT` flag enabled
2. Enable Transaction Signature Hook Collection `asfTshCollect` on your account (SetFlag: 11)
3. Create a CronSet transaction with scheduling parameters
4. Let Xahau handle automatic execution
### Execution Mechanism
When a cron is ready to execute, the Cron engine inserts a pseudo-transaction of type `Cron` into the ledger, containing an `Owner` field referencing the originating Hook account. Hook developers must enable collect calls, as the Owner constitutes a weak transactional stakeholder.
The scheduled Hook will be invoked automatically at the specified intervals without requiring external triggers.
### Time Format
Xahau uses Ripple Epoch time (seconds since January 1, 2000), not Unix time. To convert from JavaScript Date:
```javascript
const rippleEpochTime = Math.floor(Date.now() / 1000) - 946684800;
```
### Deleting a Cron
To remove an existing Cron, omit `StartTime`, `RepeatCount`, and `DelaySeconds` while setting `Flags: 1` (tfCronUnset):
```json
{
"TransactionType": "CronSet",
"Account": "rYourAccountAddress",
"Flags": 1
}
```
### Extending Repeat Count
Upon reaching a minimum threshold, a subsequent CronSet transaction can extend the repeat count beyond the initial 256 execution limit by submitting a new CronSet transaction with an updated `RepeatCount`.
### CronSet Flags
Transactions of the CronSet type support additional values in the `Flags` field, as follows:
| Flag Name | Hex Value | Decimal Value | Description |
| ------------- | ------------ | ------------- | -------------------------------------------------------------------------------- |
| `tfCronUnset` | `0x00000001` | 1 | Removes an existing Cron. All scheduling fields must be omitted when this is set. |
### Limitations and Constraints
- CronSet cannot currently be delegated to another account
- Hooks must self-emit CronSet transactions or operate under joint management arrangements
- `RepeatCount`: Must be greater than 0 and cannot exceed 256 per transaction (extendable via subsequent transactions)
- `DelaySeconds`: Maximum of 31,536,000 seconds (365 days)
- `StartTime`: Must be current time or future; cannot exceed 365 days ahead
- Cannot combine `tfCronUnset` flag with `DelaySeconds`, `RepeatCount`, or `StartTime` fields
- When creating a cron, `DelaySeconds` and `RepeatCount` must both exist or both be absent
### Error Cases
Besides errors that can occur for all transactions, CronSet transactions can result in the following transaction result codes:
| Error Code | Description |
| ------------------ | -------------------------------------------------------------------------------------------------- |
| `temDISABLED` | Occurs if the Cron feature is not enabled. |
| `temINVALID_FLAG` | Occurs if invalid flags are set in the transaction. |
| `temMALFORMED` | Occurs if the transaction is malformed with invalid field combinations. |
| `tecEXPIRED` | Occurs if `StartTime` is in the past or more than 365 days in the future. |
| `tefINTERNAL` | Occurs if the account ledger entry is missing. |
| `tefBAD_LEDGER` | Occurs if the Cron object is missing, points to a non-cron entry, or owner directory removal fails. |

View File

@@ -1,45 +1,47 @@
---
import CookieConsent from '../components/CookieConsent.astro'
import Footer from '../components/Footer.astro'
import Header from '../components/Header.jsx'
import CookieConsent from '../components/CookieConsent.astro'
import Footer from '../components/Footer.astro'
import Header from '../components/Header.jsx'
const canonicalURL = new URL(Astro.url.pathname, Astro.site)
const socialImageURL = new URL('/xahau-logo.png', Astro.site)
const title = Astro.props.frontmatter?.title
? `Xahau: ${Astro.props.frontmatter?.title}`
: 'Xahau'
const description = Astro.props.frontmatter?.description
? Astro.props.frontmatter?.description
: 'Xahau is a blockchain for the real world. It is a smart blockchain with account-based programmability. It is cheap and fast by design. It is built for the real world.'
const _canonicalURL = new URL(Astro.url.pathname, Astro.site)
const _socialImageURL = new URL('/xahau-logo.png', Astro.site)
const _title = Astro.props.frontmatter?.title
? `Xahau: ${Astro.props.frontmatter?.title}`
: 'Xahau'
const _description = Astro.props.frontmatter?.description
? Astro.props.frontmatter?.description
: 'Xahau is a blockchain for the real world. It is a smart blockchain with account-based programmability. It is cheap and fast by design. It is built for the real world.'
---
<html lang="en">
<head>
<link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml">
<meta charset="UTF-8" />
<title>{title}</title>
<meta name="description" content={description} />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="https://fonts.googleapis.com/css2?family=Onest:wght@400;700&display=swap" rel="stylesheet" />
<link rel="canonical" href={canonicalURL} />
<meta property="og:title" content={title} />
<meta property="og:type" content="website" />
<meta property="og:description" content={description} />
<meta property="og:url" content={canonicalURL} />
<meta property="og:image" content={socialImageURL} />
<meta property="og:image:alt" content="Xahau logo" />
<meta name="twitter:card" content="summary_large_image" />
<meta property="twitter:domain" content="xahau.network" />
<meta property="twitter:url" content={canonicalURL} />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={socialImageURL} />
<meta charset="UTF-8">
<title>{_title}</title>
<meta name="description" content={_description}>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link
href="https://fonts.googleapis.com/css2?family=Onest:wght@400;700&display=swap"
rel="stylesheet"
>
<link rel="canonical" href={_canonicalURL}>
<meta property="og:title" content={_title}>
<meta property="og:type" content="website">
<meta property="og:description" content={_description}>
<meta property="og:url" content={_canonicalURL}>
<meta property="og:image" content={_socialImageURL}>
<meta property="og:image:alt" content="Xahau logo">
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="xahau.network">
<meta property="twitter:url" content={_canonicalURL}>
<meta name="twitter:title" content={_title}>
<meta name="twitter:description" content={_description}>
<meta name="twitter:image" content={_socialImageURL}>
</head>
<body class="font-[Onest] bg-xahau-background min-h-screen flex flex-col">
<Header client:load url={Astro.url} />
<slot />
<Footer />
<CookieConsent />
<Header client:load url={Astro.url}/>
<slot/>
<Footer/>
<CookieConsent/>
</body>
</html>
</html>

View File

@@ -1,95 +1,98 @@
---
import '../styles/docs.css'
import CookieConsent from '../components/CookieConsent.astro'
import DocsMobileMenuToggle from '../components/DocsMobileMenuToggle.astro'
import Footer from '../components/Footer.astro'
import Header from '../components/Header.jsx'
import '../styles/docs.css'
import CookieConsent from '../components/CookieConsent.astro'
import DocsMobileMenuToggle from '../components/DocsMobileMenuToggle.astro'
import Footer from '../components/Footer.astro'
import Header from '../components/Header.jsx'
const { hasSidebar } = Astro.locals.starlightRoute
const _hasSidebar = Astro.locals.starlightRoute.hasSidebar
---
<link href="https://fonts.googleapis.com/css2?family=Onest:wght@400;700&display=swap" rel="stylesheet" />
<link
href="https://fonts.googleapis.com/css2?family=Onest:wght@400;700&display=swap"
rel="stylesheet"
>
<div class="font-[Onest] bg-xahau-background min-h-screen flex flex-col">
<Header client:load url={Astro.url} />
<Header client:load url={Astro.url}/>
<div class="page-content flex-1 container mx-auto p-6">
<div class="grid grid-cols-1 md:grid-cols-5 gap-4">
<div>
{
hasSidebar && (
<nav class="sidebar print:hidden" aria-label={Astro.locals.t('sidebarNav.accessibleLabel')}>
<DocsMobileMenuToggle />
<div id="starlight__sidebar" class="sidebar-pane">
<div class="sidebar-content sl-flex">
<slot name="sidebar" />
</div>
</div>
</nav>
)
}
{
_hasSidebar && (
<nav class="sidebar print:hidden" aria-label={Astro.locals.t('sidebarNav.accessibleLabel')}>
<DocsMobileMenuToggle />
<div id="starlight__sidebar" class="sidebar-pane">
<div class="sidebar-content sl-flex">
<slot name="sidebar" />
</div>
</div>
</nav>
)
}
</div>
<div class="col-span-4">
<slot />
<slot/>
</div>
</div>
</div>
<Footer />
<CookieConsent />
<Footer/>
<CookieConsent/>
</div>
<style>
@layer starlight.core {
.page {
flex-direction: column;
min-height: 100vh;
}
@layer starlight.core {
.page {
flex-direction: column;
min-height: 100vh;
}
.sidebar-pane {
visibility: var(--sl-sidebar-visibility, hidden);
position: fixed;
z-index: var(--sl-z-index-menu);
inset-block: var(--sl-nav-height) 0;
inset-inline-start: 0;
top: 0;
width: 100%;
background-color: var( --color-xahau-background);
overflow-y: auto;
}
.sidebar-pane {
visibility: var(--sl-sidebar-visibility, hidden);
position: fixed;
z-index: var(--sl-z-index-menu);
inset-block: var(--sl-nav-height) 0;
inset-inline-start: 0;
top: 0;
width: 100%;
background-color: var(--color-xahau-background);
overflow-y: auto;
}
:global([aria-expanded='true']) ~ .sidebar-pane {
--sl-sidebar-visibility: visible;
}
:global([aria-expanded='true']) ~ .sidebar-pane {
--sl-sidebar-visibility: visible;
}
.sidebar-content {
height: 100%;
min-height: max-content;
padding: 88px var(--sl-sidebar-pad-x) 0;
flex-direction: column;
gap: 1rem;
}
.sidebar-content {
height: 100%;
min-height: max-content;
padding: 88px var(--sl-sidebar-pad-x) 0;
flex-direction: column;
gap: 1rem;
}
@media (min-width: 50rem) {
.sidebar-content {
padding: 1rem var(--sl-sidebar-pad-x) 0;
}
}
@media (min-width: 50rem) {
.sidebar-content {
padding: 1rem var(--sl-sidebar-pad-x) 0;
}
}
@media (min-width: 50rem) {
.sidebar-content::after {
content: '';
padding-bottom: 1px;
}
}
@media (min-width: 50rem) {
.sidebar-content::after {
content: '';
padding-bottom: 1px;
}
}
.main-frame {
padding-top: calc(var(--sl-nav-height) + var(--sl-mobile-toc-height));
padding-inline-start: var(--sl-content-inline-start);
}
.main-frame {
padding-top: calc(var(--sl-nav-height) + var(--sl-mobile-toc-height));
padding-inline-start: var(--sl-content-inline-start);
}
@media (min-width: 50rem) {
.sidebar-pane {
--sl-sidebar-visibility: visible;
position: relative
border-inline-end: 1px solid var(--sl-color-hairline-shade);
}
}
}
@media (min-width: 50rem) {
.sidebar-pane {
--sl-sidebar-visibility: visible;
position: relative;
border-inline-end: 1px solid var(--sl-color-hairline-shade);
}
}
}
</style>

View File

@@ -1,86 +1,166 @@
---
import '../styles/main.css'
import worldmap from '../assets/worldmap.svg'
import BaseLayout from '../layouts/BaseLayout.astro'
import '../styles/main.css'
import worldmap from '../assets/worldmap.svg'
import BaseLayout from '../layouts/BaseLayout.astro'
const { frontmatter } = Astro.props
const _frontmatter = Astro.props.frontmatter
---
<BaseLayout frontmatter={frontmatter}>
<div class="relative flex flex-col items-center justify-center min-h-[80vh] py-40">
<div class="absolute inset-0 flex items-center justify-center pointer-events-none select-none">
<BaseLayout frontmatter={_frontmatter}>
<div
class="relative flex flex-col items-center justify-center min-h-[80vh] py-40"
>
<div
class="absolute inset-0 flex items-center justify-center pointer-events-none select-none"
>
<div class="w-full h-full mx-auto">
<img src={worldmap.src} alt="World map" class="w-full h-full object-contain" />
<img
src={worldmap.src}
alt="World map"
class="w-full h-full object-contain"
>
</div>
</div>
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6 z-10">
<div class="flex flex-col items-center text-center">
<h1 class="text-4xl md:text-5xl font-extrabold text-black mb-4 max-w-2/3">The Smarter Blockchain with Account-Based Programmability</h1>
<p class="text-2xl md:text-2xl font-semibold text-black mb-8 max-w-2/3">Not just smart contracts smart accounts. Cheap and fast by design. Built for the real world.</p>
<h1
class="text-4xl md:text-5xl font-extrabold text-black mb-4 max-w-2/3"
>
The Smarter Blockchain with Account-Based Programmability
</h1>
<p class="text-2xl md:text-2xl font-semibold text-black mb-8 max-w-2/3">
Not just smart contracts smart accounts. Cheap and fast by design.
Built for the real world.
</p>
<div class="flex gap-4">
<a href="/about" class="px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition">Learn the basics</a>
<a href="/docs" class="px-10 h-12 flex items-center justify-center bg-gray-300 text-black text-base font-bold hover:bg-black hover:text-white transition">View docs</a>
<a
href="/about"
class="px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition"
>
Learn the basics
</a>
<a
href="/docs"
class="px-10 h-12 flex items-center justify-center bg-gray-300 text-black text-base font-bold hover:bg-black hover:text-white transition"
>
View docs
</a>
</div>
</div>
</div>
</div>
</div>
<div class="flex flex-col">
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6">
<h1 class="text-3xl md:text-4xl font-extrabold text-black mb-4">The Xahau Network</h1>
<h2 class="text-xl md:text-2xl font-semibold text-black mb-8">Why is Xahau the right blockchain for your business?</h2>
<h1 class="text-3xl md:text-4xl font-extrabold text-black mb-4">
The Xahau Network
</h1>
<h2 class="text-xl md:text-2xl font-semibold text-black mb-8">
Why is Xahau the right blockchain for your business?
</h2>
<div class="items-start grid grid-cols-1 md:grid-cols-3 gap-8">
<div>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">1. Smart Contract Hooks</h3>
<p class="text-base font-light text-black">Xahau supports lightweight smart contracts directly on accounts, enabling automatic logic for approvals, rejections, or custom behavior without requiring users to call a contract.</p>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">
1. Smart Contract Hooks
</h3>
<p class="text-base font-light text-black">
Xahau supports lightweight smart contracts directly on accounts,
enabling automatic logic for approvals, rejections, or custom
behavior without requiring users to call a contract.
</p>
</div>
<div>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">2. Low Fees with Fee Burning</h3>
<p class="text-base font-light text-black">Xahau offers predictable, low transaction costs. A portion of each fee is burned, reducing spam and aligning incentives with long-term network health.</p>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">
2. Low Fees with Fee Burning
</h3>
<p class="text-base font-light text-black">
Xahau offers predictable, low transaction costs. A portion of each
fee is burned, reducing spam and aligning incentives with long-term
network health.
</p>
</div>
<div>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">3. Enterprise-Ready Governance</h3>
<p class="text-base font-light text-black">With structured governance and validator coordination, Xahau provides a stable environment for regulated and enterprise use, including supply chain, payments, and compliance applications.</p>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">
3. Enterprise-Ready Governance
</h3>
<p class="text-base font-light text-black">
With structured governance and validator coordination, Xahau
provides a stable environment for regulated and enterprise use,
including supply chain, payments, and compliance applications.
</p>
</div>
<div>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">4. Fast, Green, and Scalable</h3>
<p class="text-base font-light text-black">With an efficient consensus protocol, Xahau processes transactions quickly without mining—ideal for businesses needing performance and sustainability.</p>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">
4. Fast, Green, and Scalable
</h3>
<p class="text-base font-light text-black">
With an efficient consensus protocol, Xahau processes transactions
quickly without mining—ideal for businesses needing performance and
sustainability.
</p>
</div>
<div>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">5. Token and Asset Control by Design</h3>
<p class="text-base font-light text-black">Businesses can issue assets or tokens with fine-grained control over how theyre used or transferred, enforcing rules automatically at the ledger level.</p>
<h3 class="text-xl md:text-2xl font-bold text-black mb-2">
5. Token and Asset Control by Design
</h3>
<p class="text-base font-light text-black">
Businesses can issue assets or tokens with fine-grained control over
how theyre used or transferred, enforcing rules automatically at
the ledger level.
</p>
</div>
<a href="/features" class="self-end px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition">Discover more features</a>
<a
href="/features"
class="self-end px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition"
>Discover more features</a
>
</div>
</div>
</div>
<div class="flex flex-col items-end">
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6">
<h1 class="text-3xl md:text-4xl font-extrabold text-black mb-4">Network statistics</h1>
<h2 class="text-xl md:text-2xl font-semibold text-black mb-8">Xahau in numbers</h2>
<h1 class="text-3xl md:text-4xl font-extrabold text-black mb-4">
Network statistics
</h1>
<h2 class="text-xl md:text-2xl font-semibold text-black mb-8">
Xahau in numbers
</h2>
<div class="items-end grid grid-cols-6 md:grid-cols-9 gap-4">
<div class="text-black flex flex-col col-span-4 md:col-span-3 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
<div
class="text-black flex flex-col col-span-4 md:col-span-3 min-h-40 items-start justify-end p-4 bg-white border-black border-2"
>
<h3 class="text-xl md:text-2xl font-semibold">Accounts</h3>
<h4 class="text-4xl md:text-6xl font-extrabold">130K+</h4>
</div>
<div class="text-black flex flex-col col-span-2 md:col-span-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
<div
class="text-black flex flex-col col-span-2 md:col-span-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2"
>
<h3 class="text-xl md:text-2xl font-semibold">Hooks installed</h3>
<h4 class="text-4xl md:text-6xl font-extrabold">5K+</h4>
</div>
<div class="text-xahau-secondary flex flex-col col-span-2 md:col-span-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2">
<div
class="text-xahau-secondary flex flex-col col-span-2 md:col-span-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2"
>
<h3 class="text-xl md:text-2xl font-semibold">Nodes</h3>
<h4 class="text-4xl md:text-6xl font-extrabold">300+</h4>
</div>
<div class="text-xahau-secondary flex flex-col col-span-4 md:col-span-2 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2">
<div
class="text-xahau-secondary flex flex-col col-span-4 md:col-span-2 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2"
>
<h3 class="text-xl md:text-2xl font-semibold">Transactions/24h</h3>
<h4 class="text-4xl md:text-6xl font-extrabold">1.5M+</h4>
</div>
<div class="text-black flex flex-col col-span-6 md:col-span-3 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
<div
class="text-black flex flex-col col-span-6 md:col-span-3 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2"
>
<h3 class="text-xl md:text-2xl font-semibold">Ledgers closed</h3>
<h4 class="text-4xl md:text-6xl font-extrabold">16M+</h4>
</div>
<a href="/docs/infrastructure/system-requirements/" class="col-span-6 row-start-auto md:row-start-2 px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition">Want to run a node?</a>
<a
href="/docs/infrastructure/system-requirements/"
class="col-span-6 row-start-auto md:row-start-2 px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition"
>Want to run a node?</a
>
</div>
</div>
</div>
<slot />
<slot/>
</BaseLayout>

View File

@@ -1,14 +1,13 @@
---
import '../styles/main.css'
import BaseLayout from '../layouts/BaseLayout.astro'
import '../styles/main.css'
import BaseLayout from '../layouts/BaseLayout.astro'
const { frontmatter } = Astro.props
const _frontmatter = Astro.props.frontmatter
---
<BaseLayout frontmatter={frontmatter}>
<BaseLayout frontmatter={_frontmatter}>
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6">
<h1 class="text-5xl font-extrabold mb-2">{frontmatter.title}</h1>
<h2 class="text-2xl font-semibold">{frontmatter.description}</h2>
<h1 class="text-5xl font-extrabold mb-2">{_frontmatter.title}</h1>
<h2 class="text-2xl font-semibold">{_frontmatter.description}</h2>
</div>
{Astro.props.wide ? <main class="page-content"><slot /></main> : <main class="page-content flex-1 container mx-auto max-w-7xl p-6"><slot /></main>}
</BaseLayout>
</BaseLayout>

94
src/pages/connect.mdx Normal file
View File

@@ -0,0 +1,94 @@
---
title: Xahau Connect
description: Professional blockchain events for serious discussion and innovation
---
import PageLayout from '../layouts/PageLayout.astro';
import PageSection from '../components/PageSection.astro';
<PageLayout frontmatter={frontmatter} wide="true">
<PageSection align="left" gem="5" gemSize="large" loading="eager">
## Upcoming Events
### Next Event: Blockchain and Regulation: Europe Under Legal Scrutiny
<div class="space-y-3">
<div>
<strong>📅 Date & Time:</strong> Thursday, December 4th, 2025 at 6:30 PM (18:30) CET
</div>
<div>
<strong>📍 Location:</strong> MIL (Madrid Innovation Lab)<br/>
Calle Bravo Murillo 37-39<br/>
Madrid, Spain<br/>
<a href="https://www.google.com/maps/place/MIL+(+Madrid+Innovation+Lab+)/@40.434491,-3.7064685,906m/data=!3m1!1e3!4m6!3m5!1s0xd4229d08548c999:0x5f5190cb07369de2!8m2!3d40.4366246!4d-3.7048174!16s%2Fg%2F11snptdnc1?hl=es-ES&entry=ttu&g_ep=EgoyMDI1MTEwNS4wIKXMDSoASAFQAw%3D%3D" target="_blank" rel="noopener noreferrer">View on Google Maps</a>
</div>
<div>
<strong>🎤 Featured Speakers:</strong>
<div class="ml-6 mt-1 space-y-1">
<div>• <strong>Horacio Gómez Rey</strong> Head of Legal Spain, N26</div>
<div>• <strong>Pedro Méndez de Vigo</strong> AVP Legal Europe, Crypto.com</div>
</div>
</div>
<div>
<strong>📺 Live Stream:</strong> Watch online at <a href="https://www.youtube.com/@MadridInnovationLab" target="_blank" rel="noopener noreferrer">Madrid Innovation Lab YouTube</a>
</div>
<div>
<strong>🎟️ Registration:</strong> Register to attend in person using this [form](https://forms.office.com/e/3vrU9ihHVe)
</div>
</div>
Join us for an in-depth discussion on blockchain regulation in Europe, featuring leading legal experts from major fintech and crypto companies. This session will explore the evolving regulatory landscape, compliance challenges, and the future of blockchain under European legal scrutiny.
## About Xahau Connect
**Xahau Connect** is a series of professional blockchain events created by [**INFTF**](https://www.inftf.org) (Inclusive Financial Technology Foundation) to foster serious, agnostic discussions about blockchain technology and its real-world applications.
The events bring together experts, professional builders, researchers, and innovators from diverse blockchain ecosystems to share knowledge, explore challenges, and collaborate on advancing the technology beyond hype and speculation.
## Our Mission
At Xahau Connect, we focus on:
<div class="space-y-2">
<div>• <strong>Serious Technical Discussion:</strong> In-depth conversations on blockchain architecture, business, opportunities, regulation, innovation and more topics.</div>
<div>• <strong>Blockchain Agnosticism:</strong> Welcoming perspectives from all blockchain ecosystems and technologies.</div>
<div>• <strong>Professional Networking:</strong> Connecting builders, experts, developers, researchers, and industry leaders.</div>
<div>• <strong>Real-World Applications:</strong> Focusing on practical implementations and use cases that drive adoption.</div>
<div>• <strong>Knowledge Sharing:</strong> Learning from experts across different blockchain domains and industries.</div>
</div>
</PageSection>
<PageSection class="bg-xahau-gray text-white" align="right" gem="9">
## Who Should Attend
Xahau Connect events are designed for:
<div class="space-y-2">
<div>• <strong>Blockchain Developers & Builders</strong> working on protocols, smart contracts, dApps, and infrastructure.</div>
<div>• <strong>Technical Architects</strong> designing blockchain solutions and integrations.</div>
<div>• <strong>Researchers & Academics</strong> exploring blockchain theory, cryptography, and distributed systems.</div>
<div>• <strong>Enterprise Leaders</strong> evaluating blockchain for business applications.</div>
<div>• <strong>Ecosystem Contributors</strong> building tools, documentation, and community resources.</div>
<div>• <strong>Industry Professionals</strong> applying blockchain in finance, supply chain, identity, and other sectors. If you're serious about the technology and its potential, Xahau Connect is for you.</div>
</div>
</PageSection>
<PageSection align="left" gem="2">
## Speakers, Sponsors & Contact
### Get Involved
<div class="space-y-2">
<div>• <strong>Speaking Proposals & Sponsorship Inquiries:</strong> <a href="mailto:connect@xahau.org">connect@xahau.org</a></div>
</div>
We're grateful to our partners who support Xahau Connect's mission of fostering professional blockchain discourse. Partner and speaker details will be announced as we confirm participation for upcoming events.
### Subscribe for Updates
To receive notifications about upcoming Xahau Connect events:
<div class="space-y-2">
<div>• Follow <a href="https://x.com/XahauNetwork" target="_blank" rel="noopener noreferrer">@XahauNetwork</a> and <a href="https://x.com/incfintech" target="_blank" rel="noopener noreferrer">INFTF</a> on X</div>
<div>• Email us at <a href="mailto:connect@xahau.org">connect@xahau.org</a></div>
</div>
</PageSection>
</PageLayout>

210
src/pages/contest.mdx Normal file
View File

@@ -0,0 +1,210 @@
---
title: Xahau Dev Contest
description: Ecosystem Rising - Build user-facing services powered by Xahau
---
import PageLayout from '../layouts/PageLayout.astro';
import PageSection from '../components/PageSection.astro';
<PageLayout frontmatter={frontmatter} wide="true">
<PageSection align="left" gem="5" gemSize="large" loading="eager">
## Introduction
Welcome to the **Xahau Dev Contest: Ecosystem Rising**!
This contest invites innovators to build **user-facing services powered by Xahau** and compete for prizes while strengthening the Xahau ecosystem.
## Prizes
* **3 main prizes in XAH** for the winning projects.
* **🥇 1st Prize** 4000 USD value in XAH.
* **🥈 2nd Prize** 2000 USD value in XAH.
* **🥉 3rd Prize** 1000 USD value in XAH.
## Timeline
* **Submission deadline:** February 1st, 2026.
* **Judging panel:** 5 members from the Xahau and XRPL community (see below).
</PageSection>
<PageSection class="bg-xahau-gray text-white" align="right" gem="9">
## Judges Panel
The contest will be evaluated by **five community members**:
* • [**tequ**](https://x.com/_tequ_) Xahau Blockchain Developer
* • [**Robert Kiuru**](https://x.com/robertkiuru) COO, *XRPL Labs*
* • **[gadget78](https://x.com/gadget78)** Evernode Developer
* • [**Andrei Rosseti**](https://x.com/andreirosseti) Architect of Xahau DocProof | CTO, *EleveCRM*
* • [**Vet**](https://x.com/Vet_X0) XRPL Community contributor
## Theme: Services on Xahau
Participants must build **web-based services that interact with Xahau (Mainnet)** and are designed for the **end user**, whether casual users, power users, public sector, or private sector audiences.
Examples include **(but are not limited to)**:
<div class="space-y-2">
<div>
<strong>• Everyday user tools:</strong>
<div class="ml-6 space-y-1">
<div>◦ Personal finance dashboards</div>
<div>◦ Wallet managers</div>
<div>◦ Community apps</div>
</div>
</div>
<div>
<strong>• Business services:</strong>
<div class="ml-6 space-y-1">
<div>◦ Payment portals</div>
<div>◦ Loyalty platforms</div>
<div>◦ Client service tools</div>
</div>
</div>
<div>
<strong>• Public platforms:</strong>
<div class="ml-6 space-y-1">
<div>◦ NFT marketplaces</div>
<div>◦ Voting systems</div>
<div>◦ Donation hubs</div>
<div>◦ Cultural apps</div>
<div>◦ Utilities for social good</div>
</div>
</div>
</div>
</PageSection>
<PageSection align="left" gem="4">
## Participation Rules
<div class="space-y-2">
<div>• You can submit <strong>as many projects as you like</strong>.</div>
<div>• Each project may be submitted by an individual or a group of participants.</div>
<div>• Different projects from the same participant(s) can be eligible for different prizes.</div>
<div>• Projects <strong>must run on the Xahau Mainnet</strong>.</div>
<div>
<div>• Each project <strong>must be accessible online</strong>, so that both judges and the public can use or view it.</div>
<div class="ml-6 mt-1">◦ This avoids the need for judges to install or configure projects locally, and reduces the risk of unexpected errors or participant assistance being required.</div>
</div>
<div>
<div>• Each submission must include <strong>basic documentation</strong> to help others understand the project.</div>
<div class="ml-6 mt-1">◦ Optionally, you can also include <strong>multimedia material</strong> (videos, slides, demos, etc.) to better explain your work.</div>
</div>
<div>• <strong>AI tools</strong> may be used both for development and documentation.</div>
<div>• If your project uses <strong>Hooks</strong>, the Hook code must be open source, so that it can be audited for safety and serve as a learning resource for the community. You must attach their C code in your submission along with the hook hash. Check the "Submission Format" section.</div>
<div>• Projects that clearly offer regulated financial services or that target illegal activities are not eligible.</div>
<div>• To be evaluated by the judges, you must include your submission with a PR as indicated in the "Submission Format" section.</div>
<div>• Once your submission PR has been created, post a tweet on X about your project, tagging <a href="https://x.com/XahauNetwork" target="_blank" rel="noopener noreferrer">@XahauNetwork</a>, to announce that you've participated in the Xahau Dev Contest.</div>
</div>
</PageSection>
<PageSection class="bg-xahau-gray text-white" align="right" gem="13">
## Evaluation Criteria
When reviewing submissions, judges will especially value:
<div class="space-y-2">
<div>• <strong>Originality and creativity</strong> of the idea.</div>
<div>• <strong>Absence of existing competitors</strong> providing the same service on Xahau Mainnet prior to the contest.</div>
<div>• <strong>Impact and usefulness</strong> for end users (individuals, businesses, or public sector).</div>
<div>• <strong>Quality of execution</strong> (stability, documentation, user experience).</div>
<div>• <strong>Use of Hooks (Smart Contracts on Xahau)</strong>.</div>
</div>
</PageSection>
<PageSection align="left" gem="2">
## Submission Format
Each project must include a folder and at least a **submission file** inside submissions directory of **[this repository](https://github.com/xahau/xahau-2nd-dev-contest)**.
The file and directory must be named with your GitHub username followed by the project name, separated by an underscore, and using the .md extension for the file.
Example: submissions/GitHubName_ProjectName/GitHubName_ProjectName.md
The file should contain the following fields:
<div class="space-y-2">
<div>• <strong>Project Title</strong></div>
<div>• <strong>Brief Description</strong></div>
<div>• <strong>Participants</strong> (names or nicknames)</div>
<div>• <strong>Participants' Social Media</strong></div>
<div>• <strong>Contact Email</strong></div>
<div>• <strong>Link to the Online Project</strong></div>
<div>• <strong>Xahau Address to receive the prize in case of winning</strong></div>
<div>• <strong>Link to Documentation</strong></div>
<div>• <strong>Hooks code in C and matching hash</strong> (in case your project uses one or more, to confirm it's safe, you should add .c files in your submission folder)</div>
<div>• <strong>Hooks account of the project</strong> (to confirm you are using the hooks previously provided for this project)</div>
<div>• <strong>Link to Project's Repository</strong> (optional)</div>
<div>• <strong>Other Links</strong> (optional, e.g., demo video, presentation, slides)</div>
</div>
A template directory and file are available in the repository folder, which participants can use to fill in their project details.
</PageSection>
<PageSection class="bg-xahau-gray text-white" align="right" gem="11">
## Support & Community
If you have questions or need guidance:
* Join the **[Xahau Builders Discord](https://discord.gg/ds7nb93mYj)**.
* Or email us at **[contests@xahau.org](mailto:contests@xahau.org)**.
We will try to answer as soon as possible. Your questions may also be added to the FAQ in this README so that others can benefit from the answers.
## Ownership
* All submitted projects remain the **property of their original creators**.
## Useful Links
Here are some useful resources for Xahau developers:
* [Xahau Documentation](https://docs.xahau.network)
* [Xahau Hooks Documentation](https://docs.xahau.network/hooks/)
* [Xahau GitHub Repositories](https://github.com/Xahau)
* [Xaman Website](https://xaman.app)
* [Xahau Testnet Faucet](https://xahau-test.net/)
* [Xahau Discord](https://discord.gg/ds7nb93mYj)
## Recap: What You Need to Do
<div class="space-y-2">
<div>• Get inspired. Be creative and motivated to build something that strengthens the Xahau ecosystem.</div>
<div>• Build your project. Develop your web-based service using the Xahau Mainnet.</div>
<div>• Submit your work, Create a PR (Pull Request) following the instructions in the "Submission Format" section.</div>
<div>• Announce your participation. Post a tweet on X about your project, tagging <a href="https://x.com/XahauNetwork" target="_blank" rel="noopener noreferrer">@XahauNetwork</a>, and share that you've joined the <strong>Xahau Dev Contest</strong>.</div>
</div>
</PageSection>
<PageSection align="left" gem="6">
## FAQ
**Q: Can I submit more than one project?**
- A: Yes! You can submit as many as you want, individually or as part of a group.
**Q: Do the projects have to be open source?**
- A: No, but they must include at least basic documentation so the judges can understand how they work. If your project includes Hooks, you must attach their C code in your submission along with the hook hash. Check the "Submission Format" section.
**Q: Can I use AI to help me build or document my project?**
- A: Yes, AI usage is fully allowed.
**Q: What kind of services are you expecting?**
- A: Any service that provides **value to end users** — whether individuals, businesses, or the public sector. From NFT marketplaces and financial dashboards to voting systems, payment apps, donation hubs, or any innovative public/private service.
**Q: Is there an advantage to using Hooks?**
- A: Yes, projects that creatively implement **Hooks (smart contracts in Xahau)** will receive special recognition.
**Q: What happens to my project after the contest?**
- A: You keep full ownership.
**Q: Where can I ask questions?**
- A: On the **[Xahau Community Discord](https://discord.gg/ds7nb93mYj)** or by emailing **[contests@xahau.org](mailto:contests@xahau.org)**.
</PageSection>
<PageSection class="bg-xahau-gray text-white" align="right" gem="7">
## Final Disclaimer
By participating, you agree to the following:
<div class="space-y-2">
<div>• Participants must meet eligibility criteria and adhere to all rules. It is not allowed to submit projects that have already been published before the competition.</div>
<div>• Projects remain the property of their creators, but organizers reserve the right to showcase, share, or feature submissions with appropriate credit.</div>
<div>• The organizers retain the right to disqualify submissions that violate rules or compromise the contest's integrity. All jury decisions are final and not subject to appeal.</div>
<div>• Organizers are not liable for damages, expenses or losses during participation. The organizers also reserve the right to modify the contest requirements at any time if necessary.</div>
<div>• You acknowledge that sanctions and certain jurisdictional restrictions may apply. Eligibility to receive rewards may require compliance with applicable laws, including the completion of KYC (Know Your Customer) verification.</div>
<div>• All taxes, fees, or other financial obligations related to rewards are the sole responsibility of the participants.</div>
<div>• If you have any concerns or doubts regarding eligibility, requirements, or tax obligations, please reach out to us through the provided communication channels before submitting your entry.</div>
<div>Now it's your turn: **Build, submit, and showcase your innovation with Xahau blockchain!**</div>
</div>
</PageSection>
</PageLayout>

View File

@@ -1,66 +1,139 @@
---
import '../styles/main.css'
import PageLayout from '../layouts/PageLayout.astro'
import PageSection from '../components/PageSection.astro'
import '../styles/main.css'
import PageSection from '../components/PageSection.astro'
import PageLayout from '../layouts/PageLayout.astro'
const frontmatter = {
title: 'Report Fraud',
description: 'Have you been scammed or hacked? Here is what to do!'
}
const _frontmatter = {
title: 'Report Fraud',
description: 'Have you been scammed or hacked? Here is what to do!',
}
---
<PageLayout frontmatter={_frontmatter} wide="true">
<PageSection align="center">
<p>
Xahau is a public blockchain, with no governing party that can freeze or
retrieve funds, close accounts, or otherwise keep people from their
assets.
</p>
<div class="p-4 bg-green-50 border border-green-200 rounded-lg my-4">
<strong>We can't reverse or cancel transactions, no-one can.</strong>
</div>
<p>We can flag accounts used for illicit activity, which will:</p>
<ul class="list-disc list-outside">
<li>
Be included in our API that exchanges and other entities are using for
AML compliance to monitor deposits, and possibly withhold illicit funds.
</li>
<li>
Movement of funds will be auto-traced and we will receive notifications
whenever they move, no matter how old the case is.
</li>
<li>
In case of a scam, warn other users through wallet software and
exchanges using our API, not to send funds to a flagged account.
</li>
</ul>
<h3 class="mt-4">1. Submit the address to Xahau Forensics</h3>
<p>
We maintain the largest fraudulent address registry on Xahau and is used
by several entities to combat illicit activity.
</p>
<h3 class="mt-4">2. Report your case to law enforcement</h3>
<p>
Report it to the local police and if your country has an online report
form for cybercrime or financial crime, report it there as well.
</p>
<h3 class="mt-4">3. Follow up on your police report</h3>
<p>
We work with law enforcement. Let them know that we have the information
the odds are that we are also in contact with other victims and can help
law enforcement combine cases across jurisdictions and provide actionable
intelligence.
</p>
<h2 class="mt-4">What can you expect?</h2>
<ul class="list-disc list-outside">
<li>We can't reverse or cancel transactions, no-one can.</li>
<li>
We do our best to have funds seized when they leave Xahau, by working
with exchanges and other off ramps both through our fraudulent address
registry API and by manually making contact.
</li>
<li>
When you report an account to us, you can expect us to treat your report
with as much attention than any other report.
</li>
<li>
We get many reports every single day. If an account is added to our
fraudulent address registry, we are taking the best care of it along
with all other cases.
</li>
<li>
If money is seized we will contact you (if you have left us a way to
contact you).
</li>
<li>
To reclaim funds you <strong>have</strong>to work with law enforcement
for paperwork
</li>
</ul>
<div class="p-4 bg-green-50 border border-green-200 rounded-lg my-4">
<strong
>We monitor hundreds of cases at the same time and can't hold hands on a
case-by-case basis. We will only contact you if we have good news!</strong
>
</div>
</PageSection>
<PageLayout frontmatter={frontmatter} wide="true">
<PageSection align="center">
<p>Xahau is a public blockchain, with no governing party that can freeze or retrieve funds, close accounts, or otherwise keep people from their assets.</p>
<div class="p-4 bg-green-50 border border-green-200 rounded-lg my-4">
<strong>We can't reverse or cancel transactions, no-one can.</strong>
</div>
<p>We can flag accounts used for illicit activity, which will:</p>
<ul class="list-disc list-outside">
<li>Be included in our API that exchanges and other entities are using for AML compliance to monitor deposits, and possibly withhold illicit funds.</li>
<li>Movement of funds will be auto-traced and we will receive notifications whenever they move, no matter how old the case is.</li>
<li>In case of a scam, warn other users through wallet software and exchanges using our API, not to send funds to a flagged account.</li>
</ul>
<h3 class="mt-4">1. Submit the address to Xahau Forensics</h3>
<p>We maintain the largest fraudulent address registry on Xahau and is used by several entities to combat illicit activity.</p>
<h3 class="mt-4">2. Report your case to law enforcement</h3>
<p>Report it to the local police and if your country has an online report form for cybercrime or financial crime, report it there as well.</p>
<h3 class="mt-4">3. Follow up on your police report</h3>
<p>We work with law enforcement. Let them know that we have the information the odds are that we are also in contact with other victims and can help law enforcement combine cases across jurisdictions and provide actionable intelligence.</p>
<h2 class="mt-4">What can you expect?</h2>
<ul class="list-disc list-outside">
<li>We can't reverse or cancel transactions, no-one can.</li>
<li>We do our best to have funds seized when they leave Xahau, by working with exchanges and other off ramps both through our fraudulent address registry API and by manually making contact.</li>
<li>When you report an account to us, you can expect us to treat your report with as much attention than any other report.</li>
<li>We get many reports every single day. If an account is added to our fraudulent address registry, we are taking the best care of it along with all other cases.</li>
<li>If money is seized we will contact you (if you have left us a way to contact you).</li>
<li>To reclaim funds you <strong>have</strong> to work with law enforcement for paperwork</li>
</ul>
<div class="p-4 bg-green-50 border border-green-200 rounded-lg my-4">
<strong>We monitor hundreds of cases at the same time and can't hold hands on a case-by-case basis. We will only contact you if we have good news!</strong>
</div>
</PageSection>
<main class="page-content flex-1 container mx-auto max-w-4xl p-6">
<div class="bg-white rounded-lg shadow-lg p-8">
<!-- Success message (hidden by default, shown via JS) -->
<div id="success-message" class="mb-6 p-6 bg-green-50 border-2 border-green-500 text-green-800 rounded-lg hidden shadow-md">
<div
id="success-message"
class="mb-6 p-6 bg-green-50 border-2 border-green-500 text-green-800 rounded-lg hidden shadow-md"
>
<div class="flex items-center mb-2">
<svg class="w-6 h-6 mr-2 text-green-500" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
<svg
class="w-6 h-6 mr-2 text-green-500"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
clip-rule="evenodd"
/>
</svg>
<p class="font-bold text-lg">Success!</p>
</div>
<p class="mb-2">Thank you for your report. It has been submitted successfully.</p>
<p class="text-sm mt-3 font-semibold">Report ID: <code id="report-id" class="bg-green-200 px-3 py-1 rounded text-green-900"></code></p>
<p class="mb-2">
Thank you for your report. It has been submitted successfully.
</p>
<p class="text-sm mt-3 font-semibold">
Report ID:
<code
id="report-id"
class="bg-green-200 px-3 py-1 rounded text-green-900"
/>
</p>
</div>
<!-- Error message (hidden by default, shown via JS) -->
<div id="error-message" class="mb-6 p-6 bg-red-50 border-2 border-red-500 text-red-800 rounded-lg hidden shadow-md">
<div
id="error-message"
class="mb-6 p-6 bg-red-50 border-2 border-red-500 text-red-800 rounded-lg hidden shadow-md"
>
<div class="flex items-center mb-2">
<svg class="w-6 h-6 mr-2 text-red-500" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
<svg
class="w-6 h-6 mr-2 text-red-500"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z"
clip-rule="evenodd"
/>
</svg>
<p class="font-bold text-lg">Error</p>
</div>
@@ -71,7 +144,10 @@ const frontmatter = {
<div id="form-container">
<form id="fraud-report-form" class="space-y-6">
<div>
<label for="address" class="block text-sm font-semibold text-gray-700 mb-2">
<label
for="address"
class="block text-sm font-semibold text-gray-700 mb-2"
>
Xahau Address <span class="text-red-500">*</span>
</label>
<input
@@ -81,12 +157,17 @@ const frontmatter = {
required
placeholder="rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
/>
<p class="text-sm text-gray-500 mt-1">Enter the Xahau address associated with the fraudulent activity</p>
>
<p class="text-sm text-gray-500 mt-1">
Enter the Xahau address associated with the fraudulent activity
</p>
</div>
<div>
<label for="description" class="block text-sm font-semibold text-gray-700 mb-2">
<label
for="description"
class="block text-sm font-semibold text-gray-700 mb-2"
>
Description <span class="text-red-500">*</span>
</label>
<textarea
@@ -97,11 +178,16 @@ const frontmatter = {
placeholder="Describe the fraudulent activity"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
></textarea>
<p class="text-sm text-gray-500 mt-1">Provide as much detail as possible to help us investigate</p>
<p class="text-sm text-gray-500 mt-1">
Provide as much detail as possible to help us investigate
</p>
</div>
<div>
<label for="url" class="block text-sm font-semibold text-gray-700 mb-2">
<label
for="url"
class="block text-sm font-semibold text-gray-700 mb-2"
>
URL <span class="text-gray-400 text-xs">(Optional)</span>
</label>
<input
@@ -110,13 +196,19 @@ const frontmatter = {
name="url"
placeholder="Optional URL related to the fraud"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
/>
<p class="text-sm text-gray-500 mt-1">Provide a URL if relevant (e.g., scam website, social media post)</p>
>
<p class="text-sm text-gray-500 mt-1">
Provide a URL if relevant (e.g., scam website, social media post)
</p>
</div>
<div>
<label for="category_suggested" class="block text-sm font-semibold text-gray-700 mb-2">
Suggested Category <span class="text-gray-400 text-xs">(Optional)</span>
<label
for="category_suggested"
class="block text-sm font-semibold text-gray-700 mb-2"
>
Suggested Category
<span class="text-gray-400 text-xs">(Optional)</span>
</label>
<select
id="category_suggested"
@@ -128,12 +220,18 @@ const frontmatter = {
<option value="theft">Theft</option>
<option value="other">Other</option>
</select>
<p class="text-sm text-gray-500 mt-1">Help us categorize the type of fraud</p>
<p class="text-sm text-gray-500 mt-1">
Help us categorize the type of fraud
</p>
</div>
<div>
<label for="reporter_contact" class="block text-sm font-semibold text-gray-700 mb-2">
Contact Information <span class="text-gray-400 text-xs">(Optional)</span>
<label
for="reporter_contact"
class="block text-sm font-semibold text-gray-700 mb-2"
>
Contact Information
<span class="text-gray-400 text-xs">(Optional)</span>
</label>
<input
type="text"
@@ -141,8 +239,11 @@ const frontmatter = {
name="reporter_contact"
placeholder="Optional contact information, for example e-mail, X handle or Telegram username"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
/>
<p class="text-sm text-gray-500 mt-1">Provide contact info if you're willing to help with follow-up questions</p>
>
<p class="text-sm text-gray-500 mt-1">
Provide contact info if you're willing to help with follow-up
questions
</p>
</div>
<div class="bg-gray-50 p-4 rounded-lg border border-gray-200">
@@ -156,7 +257,7 @@ const frontmatter = {
<div class="flex items-center justify-between pt-4">
<p class="text-sm text-gray-600">
<span class="text-red-500">*</span> Required fields
<span class="text-red-500">*</span>Required fields
</p>
<button
type="submit"
@@ -180,29 +281,68 @@ const frontmatter = {
</div>
<div class="mt-8 bg-blue-50 border border-blue-200 rounded-lg p-6 pt-0">
<h3 class="text-lg font-semibold text-blue-900 mb-3">Privacy & Security</h3>
<h3 class="text-lg font-semibold text-blue-900 mb-3">
Privacy & Security
</h3>
<ul class="space-y-2 text-sm text-blue-800">
<li class="flex items-start">
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
<svg
class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
clip-rule="evenodd"
/>
</svg>
<span>This form uses ALTCHA, a privacy-compliant CAPTCHA that doesn't track you</span>
<span
>This form uses ALTCHA, a privacy-compliant CAPTCHA that doesn't
track you</span
>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
<svg
class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
clip-rule="evenodd"
/>
</svg>
<span>Your report is submitted securely to the Xahau Forensics network</span>
<span
>Your report is submitted securely to the Xahau Forensics network</span
>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
<svg
class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
clip-rule="evenodd"
/>
</svg>
<span>Reports are reviewed and used to improve network security</span>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
<svg
class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
clip-rule="evenodd"
/>
</svg>
<span>No personal information is required to submit a report</span>
</li>
@@ -211,164 +351,182 @@ const frontmatter = {
<div class="mt-6 text-center text-sm text-gray-600">
<p>
Xahau Forensics is run by <a href="https://inftf.org" class="text-xahau-green-dark underline hover:text-black">INFTF</a>.
Xahau Forensics is run by
<a
href="https://inftf.org"
class="text-xahau-green-dark underline hover:text-black"
>INFTF</a
>.
</p>
</div>
</main>
<script is:inline type="module">
// Import ALTCHA widget
import 'https://cdn.jsdelivr.net/npm/altcha/dist/altcha.min.js';
import 'https://cdn.jsdelivr.net/npm/altcha/dist/altcha.min.js'
// Wait for the widget to be ready
document.addEventListener('DOMContentLoaded', () => {
const form = document.getElementById('fraud-report-form');
const altchaWidget = document.querySelector('altcha-widget');
const successMessage = document.getElementById('success-message');
const errorMessage = document.getElementById('error-message');
const errorText = document.getElementById('error-text');
const reportIdEl = document.getElementById('report-id');
const formContainer = document.getElementById('form-container');
const anotherReportBtn = document.getElementById('another-report-btn');
const form = document.getElementById('fraud-report-form')
const altchaWidget = document.querySelector('altcha-widget')
const successMessage = document.getElementById('success-message')
const errorMessage = document.getElementById('error-message')
const errorText = document.getElementById('error-text')
const reportIdEl = document.getElementById('report-id')
const formContainer = document.getElementById('form-container')
const anotherReportBtn = document.getElementById('another-report-btn')
if (!form || !altchaWidget) {
return;
return
}
// Listen for state changes on the ALTCHA widget
let isVerified = false;
let isVerified = false
altchaWidget.addEventListener('statechange', (event) => {
isVerified = event.detail.state === 'verified';
});
isVerified = event.detail.state === 'verified'
})
// Handle form submission
form.addEventListener('submit', async (e) => {
e.preventDefault();
e.preventDefault()
// Hide previous messages
errorMessage.classList.add('hidden');
successMessage.classList.add('hidden');
errorMessage.classList.add('hidden')
successMessage.classList.add('hidden')
// Check verification state
if (!isVerified) {
errorText.textContent = 'Please complete the CAPTCHA verification before submitting.';
errorMessage.classList.remove('hidden');
errorText.textContent =
'Please complete the CAPTCHA verification before submitting.'
errorMessage.classList.remove('hidden')
// Scroll to top of the white card container
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg')
if (card) {
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
card.scrollIntoView({ behavior: 'smooth', block: 'start' })
}
return;
return
}
// Get ALTCHA payload - try multiple methods
let altchaSolution = null;
let altchaSolution = null
// Try getting from FormData first (if widget name attribute works)
const formData = new FormData(form);
altchaSolution = formData.get('altcha');
const formData = new FormData(form)
altchaSolution = formData.get('altcha')
// If not found, try getting directly from widget
if (!altchaSolution) {
// The widget stores the solution in a hidden input or as a property
const hiddenInput = form.querySelector('input[name="altcha"]');
const hiddenInput = form.querySelector('input[name="altcha"]')
if (hiddenInput) {
altchaSolution = hiddenInput.value;
altchaSolution = hiddenInput.value
}
}
// Try getting from data attribute
if (!altchaSolution) {
altchaSolution = altchaWidget.dataset.payload;
altchaSolution = altchaWidget.dataset.payload
}
if (!altchaSolution) {
errorText.textContent = 'CAPTCHA verification failed. Please complete the challenge and try again.';
errorMessage.classList.remove('hidden');
errorText.textContent =
'CAPTCHA verification failed. Please complete the challenge and try again.'
errorMessage.classList.remove('hidden')
// Scroll to top of the white card container
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg')
if (card) {
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
card.scrollIntoView({ behavior: 'smooth', block: 'start' })
}
return;
return
}
const requestBody = {
address: formData.get('address'),
description: formData.get('description'),
altcha_solution: altchaSolution
};
altcha_solution: altchaSolution,
}
// Add optional fields
if (formData.get('url')) requestBody.url = formData.get('url');
if (formData.get('category_suggested')) requestBody.category_suggested = formData.get('category_suggested');
if (formData.get('reporter_contact')) requestBody.reporter_contact = formData.get('reporter_contact');
if (formData.get('url')) requestBody.url = formData.get('url')
if (formData.get('category_suggested'))
requestBody.category_suggested = formData.get('category_suggested')
if (formData.get('reporter_contact'))
requestBody.reporter_contact = formData.get('reporter_contact')
// Disable submit button and show loading state
const submitBtn = form.querySelector('button[type="submit"]');
const originalText = submitBtn.textContent;
submitBtn.disabled = true;
submitBtn.innerHTML = '<span class="flex items-center justify-center"><svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg>Submitting...</span>';
const submitBtn = form.querySelector('button[type="submit"]')
const originalText = submitBtn.textContent
submitBtn.disabled = true
submitBtn.innerHTML =
'<span class="flex items-center justify-center"><svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg>Submitting...</span>'
try {
const response = await fetch('https://api.analytics.xahau.network/ufr', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
const response = await fetch(
'https://api.analytics.xahau.network/ufr',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestBody),
},
body: JSON.stringify(requestBody)
});
const result = await response.json();
)
const result = await response.json()
if (response.ok) {
// Show success message
reportIdEl.textContent = result.reportId || 'unknown';
successMessage.classList.remove('hidden');
errorMessage.classList.add('hidden');
formContainer.style.display = 'none';
anotherReportBtn.classList.remove('hidden');
reportIdEl.textContent = result.reportId || 'unknown'
successMessage.classList.remove('hidden')
errorMessage.classList.add('hidden')
formContainer.style.display = 'none'
anotherReportBtn.classList.remove('hidden')
// Scroll to top of the white card container
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
const card = document.querySelector(
'.bg-white.rounded-lg.shadow-lg',
)
if (card) {
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
card.scrollIntoView({ behavior: 'smooth', block: 'start' })
}
} else {
// Show error message
const errorMsg = Array.isArray(result.message)
? result.message.join(', ')
: (result.message || 'Failed to submit report. Please try again.');
errorText.textContent = errorMsg;
errorMessage.classList.remove('hidden');
successMessage.classList.add('hidden');
submitBtn.disabled = false;
submitBtn.innerHTML = originalText;
const errorMsg = Array.isArray(result.message)
? result.message.join(', ')
: result.message || 'Failed to submit report. Please try again.'
errorText.textContent = errorMsg
errorMessage.classList.remove('hidden')
successMessage.classList.add('hidden')
submitBtn.disabled = false
submitBtn.innerHTML = originalText
// Scroll to top of the white card container
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
const card = document.querySelector(
'.bg-white.rounded-lg.shadow-lg',
)
if (card) {
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
card.scrollIntoView({ behavior: 'smooth', block: 'start' })
}
}
} catch (error) {
errorText.textContent = 'Network error: Unable to connect to the server. Please check your connection and try again.';
errorMessage.classList.remove('hidden');
successMessage.classList.add('hidden');
submitBtn.disabled = false;
submitBtn.innerHTML = originalText;
} catch (_error) {
errorText.textContent =
'Network error: Unable to connect to the server. Please check your connection and try again.'
errorMessage.classList.remove('hidden')
successMessage.classList.add('hidden')
submitBtn.disabled = false
submitBtn.innerHTML = originalText
// Scroll to top of the white card container
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg')
if (card) {
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
card.scrollIntoView({ behavior: 'smooth', block: 'start' })
}
}
});
});
})
})
</script>
<style>
@@ -378,8 +536,9 @@ const frontmatter = {
--altcha-border-color: #e1e5e9;
--altcha-text-color: #333333;
--altcha-border-radius: 8px;
--altcha-font-family: 'Onest', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
--altcha-font-family:
'Onest', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
sans-serif;
}
</style>
</PageLayout>

View File

@@ -1,8 +1,8 @@
@layer base, starlight, theme, components, utilities;
@import "tailwindcss/theme.css" layer(theme);
@import "tailwindcss/utilities.css" layer(utilities);
@import "../styles/global.css";
@import 'tailwindcss/theme.css' layer(theme);
@import 'tailwindcss/utilities.css' layer(utilities);
@import '../styles/global.css';
header * {
line-height: 1.5;

View File

@@ -20,7 +20,6 @@ footer {
@media (prefers-reduced-motion: no-preference) {
@view-transition {
/* biome-ignore lint: noUnknownProperty */
navigation: auto;
}
}

View File

@@ -1,5 +1,5 @@
@import "tailwindcss";
@import "../styles/global.css";
@import 'tailwindcss';
@import '../styles/global.css';
.page-content h1 {
@apply text-3xl font-bold mb-2 mt-24;
@@ -24,3 +24,7 @@
.page-content a:hover {
@apply text-black;
}
.page-content .text-white a {
@apply text-white underline;
}